2012-01-31 22 views
0

我有螺紋(工作大),該方法調用中singletone對象是這樣的:如果我從線程調用QMetaObject :: invokeMethod到singletone是invokeation仍然在那個qthread中?

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

;

即時通訊使用Qt :: BlockingQueuedConnection所以我可以繼續基於BOOL值的線程工作..任何方式 我的問題是劑量這個調用仍然在線程?或者它導致方法在主線程中執行?

當我調試應用程序時,我在線程中看到我在線程編號爲xxxx 但我在updateMainWindowTree方法中設置斷點時,我看到它跳轉到主線程調試器中的應用程序。 那麼這是什麼意思,我繼續從主線程調用函數?我怎麼能避免它?

+0

ApiManager是什麼?它在哪裏? – 2012-01-31 13:46:10

+0

其全局對象,提供的API函數,不涉及GUI或某些東西,但劑量從GUI線程調用也 – user63898 2012-01-31 14:46:34

回答

1

由於您使用的是Qt::BlockingQueuedConnection,因此呼叫在QObjectApiManager::getInstance()所屬的線程中執行。

如果該單例屬於與調用代碼相同的線程,則會導致死鎖。

您可以使用Qt::DirectConnection來保持同一個線程,但函數的名稱表明它與GUI有關,因此它應該在主線程中執行(這意味着您的當前代碼及其行爲可能已經正確)。

+0

什麼是更好的更新GUI從線程使用「發射」或QMetaObject :: invokeMethod – user63898 2012-01-31 21:00:50

+0

發射信號似乎比清晰得多使用'invokeMethod',如果你不需要另一個線程的槽的返回值。 – alexisdm 2012-01-31 23:44:33

相關問題