2013-05-08 76 views
1

我有一個類包含QThread。在這個類的初始化函數中,線程應該被啓動。這工作正確。在線程中,我有一個while(bool certainCondition){}這個certainCondition應通過信號/插槽連接進行更改。QThreads插槽和信號中斷

問題是,在運行期間,信號/插槽未打開。

+0

你可以發佈一些代碼來顯示'信號/插槽沒有打開'嗎? – spiritwolfform 2013-05-08 14:03:59

+4

你只需要等待一個特定的條件?我認爲[QWaitCondition](http://qt-project.org/doc/qt-4.8/qwaitcondition.html)在這裏很有用。 – eraxillan 2013-05-08 14:06:21

回答

3

您沒有在您的線程中運行事件循環,或者您在while循環中阻塞了很長時間。直到您將控制權歸還給事件循環後才能調用您的插槽,已完成while循環後會發生

作爲解決方法,您可以嘗試在while循環中調用QCoreApplication::processEvents()

1

爲了讓信號/插槽能夠跨線程工作,事件循環必須運行。
如果使用while循環,事件循環從不運行,因此不會收到信號。
這是你如何正常運行的事件循環:

void Thread::run() 
{ 
    ...do something 
    exec(); //<<this runs the event loop 
} 

現在,你的問題是,你直到某些條件得到滿足想要連續運行一些代碼。在上面的代碼中,由於exec()調用,這不起作用。
有以下兩種方式來解決(這取決於你想要在你的循環來實現的):

  1. 使用QTimer,即火災讓我們每5秒說,並調用執行你的重複代碼插槽。

  2. 使用QWaitCondition檢查是否滿足某個條件;但是你不能使用信號和插槽;相反,你必須觸發QWaitCondition。