Multithreading 并在该线程内执行成员函数
如果将类型为Multithreading 并在该线程内执行成员函数,multithreading,qt,qt4,Multithreading,Qt,Qt4,如果将类型为QObject的对象移动到具有QObject::moveToThread的线程,则对象接收的所有信号都在该线程内处理。但是,如果直接调用插槽(object->theSlot()),该调用仍将被阻塞。在线程内执行该调用并立即将控制权返回给调用线程的正常方式是什么?使用QTimer进行黑客攻击不算数。如果所有其他操作都失败,设置单用途连接并再次删除它可能算作解决方案。您可以使用QFuture QtConcurrent::run(Function…)在单独的线程内启动一些执行,然后使用QF
QObject
的对象移动到具有QObject::moveToThread
的线程,则对象接收的所有信号都在该线程内处理。但是,如果直接调用插槽(object->theSlot()
),该调用仍将被阻塞。在线程内执行该调用并立即将控制权返回给调用线程的正常方式是什么?使用QTimer
进行黑客攻击不算数。如果所有其他操作都失败,设置单用途连接并再次删除它可能算作解决方案。您可以使用QFuture QtConcurrent::run(Function…)
在单独的线程内启动一些执行,然后使用QFutureWatcher
获得结果。您不需要调用movetoThread
基本上是这样的:
QFutureWatcher<T>* watch = new QFuture(0);
connect(watch, SIGNAL(finished()), this, SLOT(handleResult()));
QFuture<T> future = QtConcurrent::run( myObj, &QMyObject::theSlot(), args...);
watch.setFuture(future);
....
//slot
private void handleResult(){
if(future->isCancelled())
return;
T mydata = watch->future()->result();
// use your data as you want
}
QFutureWatcher*watch=newQfuture(0);
连接(手表、信号(已完成())、此、插槽(handleResult());
QFuture future=QtConcurrent::run(myObj,&QMyObject::theSlot(),args;
watch.setFuture(未来);
....
//槽
私有无效HandlerResult(){
如果(future->isCancelled())
返回;
T mydata=watch->future()->result();
//根据需要使用数据
}
QtConcurrent::run
将计划在某个线程中运行此对象的方法。它是非阻塞的。另一方面,如果计算仍在进行中,QFuture::result()
将阻塞直到有结果。这就是为什么需要使用finished()
在计算结束时通知另一个对象。我想不出更好的设计来解决您在Qt中的问题。您可以使用QMetaObject::invokeMethod
,将Qt::ConnectionType设置为Qt::QueuedConnection这将在QtConcurrent
线程的上下文中执行theSlot
,而不是在MyObject
的线程的上下文中。是的,但这有关系吗??为什么我被否决了?毕竟,他只想在调用线程之外的另一个线程中执行theSlot()
。这甚至比创建线程并调用start:。或者我误解了pmr
?。我没有投你反对票。您的替代方案使移动到线程
之外,这使得所有其他插槽都不并发。它有它的缺点,但在某些情况下仍然有意义。不过我还是支持Ton的破解。你想用QObject::moveToThread
完成吗?如果不是的话,我宁愿把所有的计算放在一个不会接收信号的物体上,然后使用我的方法……这听起来非常接近我想要的。如果对象已经在另一个线程中,那么它的行为是否与自动连接相同呢。自动连接也会这样做,但是!我总是先把这个参数放到代码中,看看我打算用QMetaObject::invokeMethod做什么