我正在使用Qt 4.7.0(32位)上Windows 7旗艦版(32位)機器。我一直在使用Qt版本4.0或4.2,我已經使用幾乎所有的4.x.y版本。QThread混淆
最近,隨着Qt 4.7我遇到了麻煩。
我在Qt的一些舊版本中編寫了一個多線程應用程序。我忘記了版本,但可能是我編譯並正確運行的最後一個版本是4.5.x或4.6.x. 線程部分在4.7中似乎沒有正常工作,或者我誤解了某些東西。這裏是問題:
主線程啓動thinker
線程。以下是thinker
線程的run()
功能:
void ThinkerThread::run()
{
_threads_running = NSUBTHINKERS;
// ...
_sub_thinker[0].start();
// ...
_sub_thinker[1].start();
exec();
}
的_sub_thinker
的finished()
信號與ThinkerThread::subThinkerFinished()
槽爲所有_sub_thinker
連接一起。當全部_sub_thinker
s完成時,ThinkerThread::subThinkerFinished()
調用quit()
。
有一種情況quit()
被稱爲另一個地方:
void ThinkerThread::tryKill()
{
for (int i = 0; i < NSUBTHINKERS; i++)
_sub_thinker[i].tryKill();
quit();
}
從主線程,執行就像如下:
- thinker.tryKill()[注:在極拳來看,思想家沒有運行。]
- thinker.start()
thinker
的finished()
信號與autoMove()
連接。
對於Qt的所有以前版本,autoMove()
在調用thinker::quit()
之後調用ThinkerThread::subThinkerFinished()
。在4.7中,我看到autoMove()
在第一次調用thinker.tryKill()
後被調用,即使線程沒有運行。
有什麼想法?
當然,如果thinker
正在運行或沒有運行,我可以在ThinkerThread::tryKill()
之內檢查。但我想知道爲什麼會發生這種情況。
謝謝。
我注意到一個在4.2-4.6上正常工作的應用程序的問題,它在4.7中死亡。像你一樣,線程出現問題。特別是當我打電話.start()時。如果我找到任何東西,我會回到這裏(除非其他人已經解決了)。順便說一句,我的問題發生在64位Linux上,所以我懷疑核心線程庫中的東西發生了變化。你有沒有在調試器下運行它,或者放入一些調試代碼來查看NSUBTHINKERS中的值? – 2010-12-21 20:16:28