正如this question中所建議的那樣,我現在正在嘗試合併多線程。關於在我的應用程序中實現QThread的問題?
根據the links given by karlphillip,我知道不應遵循有關繼承QThread的文檔,並按照說明使用moveToThread()
。現在我看到QThread run()
的默認實現只有一個exec()
,然後必須在工作線程完成操作時調用quit()
來結束。我有幾個問題,現在讓我更好地瞭解事情:
QApplication* ptrApp=new QApplication(argc,argv);
QThread* th=new QThread;
MyClass* obj=new MyClass;
obj->moveToThread(th);
QObject::connect(th,SIGNAL(started()),obj,SLOT(someFunct()));
QObject::connect(obj,SIGNAL(over()),th,SLOT(quit()));
th->start();
//some GUI code in main thread here
return ptrApp->exec();
,如果我繼續使用
someFunct()
我發出over()
即使從someFunct()
內會發生什麼?它是未定義的行爲還是正常的?哪個線程現在應與
obj
關聯(而發出over()
後的其餘代碼仍在someFunct
中執行)?我的理解是:它不能在th
,當我有quit()
那個線程...quit()
將排隊,直到exec()
在主線程執行它,這將導致exec()
run()
th
退出(我希望我不是一個錯誤在這裏)。我假設線程不再存在。一旦
th
插槽quit()
執行,是安全的假設線程確實已經退出,還是應該我的th
finished()
信號進一步連接到某些插槽是絕對肯定嗎?
感謝 1.亞這就是我被注意到的行爲......只是想確保它不是未定義/非法或東西 2.確定...請告訴我,如果我刪除會發生什麼QThread指針'th'(現在因爲我們不能重新啓動線程了,我想) 3. for'quit()'我明白,它將在隊列中執行直到'exec()'在主線程中執行它...但'finished()'是一個不需要任何事件循環的信號,它是終止線程所要做的最後一件事情,爲什麼需要另外指定'QThread :: wait()'使用'finished()'信號? – ustulation 2012-03-16 11:59:41
對於2.您可以根據需要隨時停止並重新啓動線程。對於3.發射信號不需要事件循環。無論如何,連接它的插槽應該在另一個線程中運行事件循環(線程eventloop不能接收到它自己的finished()信號)。但在查看QThread的來源後,我認爲在大多數情況下,您可以等待完成的信號。 – alexisdm 2012-03-16 14:21:52