2010-12-21 51 views
0

我正在使用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_thinkerfinished()信號與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()

thinkerfinished()信號與autoMove()連接。

對於Qt的所有以前版本,autoMove()在調用thinker::quit()之後調用ThinkerThread::subThinkerFinished()。在4.7中,我看到autoMove()在第一次調用thinker.tryKill()後被調用,即使線程沒有運行。

有什麼想法?

當然,如果thinker正在運行或沒有運行,我可以在ThinkerThread::tryKill()之內檢查。但我想知道爲什麼會發生這種情況。

謝謝。

+0

我注意到一個在4.2-4.6上正常工作的應用程序的問題,它在4.7中死亡。像你一樣,線程出現問題。特別是當我打電話.start()時。如果我找到任何東西,我會回到這裏(除非其他人已經解決了)。順便說一句,我的問題發生在64位Linux上,所以我懷疑核心線程庫中的東西發生了變化。你有沒有在調試器下運行它,或者放入一些調試代碼來查看NSUBTHINKERS中的值? – 2010-12-21 20:16:28

回答

0

我發現每次調用QThread::quit()時都會發出QThread::finished(),與QThread(即運行/不運行)的狀態無關。對於以前的Qt版本,情況並非如此。