Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 并在该线程内执行成员函数_Multithreading_Qt_Qt4 - Fatal编程技术网

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做什么