如果我从线程调用QMetaObject :: invokeMethod到singleton,调用仍然在那个qthread中?

时间:2012-01-31 13:39:31

标签: c++ multithreading qt qthread

我有线程(工作得很好),在单一对象中调用方法,如下所示:

bool bInvokeUpdate= QMetaObject::invokeMethod(ApiManager::getInstance(),
         "updateMainWindowTree",
         Qt::BlockingQueuedConnection,
         Q_RETURN_ARG(bool, bReturnUpdate))

我正在使用Qt :: BlockingQueuedConnection,所以我可以继续基于bool值的线程工作..任何方式 我的问题是剂量这个调用仍然在线程?或者它导致在主线程中执行方法?

当我调试应用程序时,我在调试器中看到我在线程ID xxxx中的线程 但是当我在updateMainWindowTree方法中设置断点时,我看到它跳转到mainthread。 那么我继续从主线程调用函数是什么意思?我怎么能避免它?

1 个答案:

答案 0 :(得分:1)

由于您使用了Qt::BlockingQueuedConnection,因此调用将在QObject ApiManager::getInstance()所属的主题中执行。

如果该单例属于与调用代码相同的线程,则会出现死锁。

您可以使用Qt::DirectConnection保留在同一个线程中,但是您的函数名称表明它与GUI有关,因此它应该在主线程中执行(意味着您当前的代码及其行为可能已经正确了。)