如果将QObject
类型的对象移动到具有QObject::moveToThread
的线程,则该对象接收的所有信号都在该线程内处理。但是,如果直接调用一个插槽(object->theSlot()
),该调用仍会阻塞。在线程内执行该调用并将控制立即返回到调用线程的正常方法是什么? QTimer
的黑客不计算在内。如果所有其他连接都失败,设置单一用途连接并再次删除它可能会成为一种解决方案。
答案 0 :(得分:5)
你可以使用QMetaObject::invokeMethod
将Qt :: ConnectionType设置为Qt :: QueuedConnection
答案 1 :(得分:0)
您可以使用QFuture<T> QtConcurrent::run ( Function 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
}
QtConcurrent::run
将安排在某个线程中运行此对象的方法。它是非阻塞的。另一方面,如果计算仍在进行中,QFuture::result()
将阻塞直到有结果。这就是为什么在使用finished()
计算结束时需要另一个对象通知的原因。我无法想象Qt中你的问题有更好的设计。