2013-06-05 182 views
0

我想在我的QT應用程序中實現超時。我已經使用QThread來執行操作(需要超時的任務),並使用QElapsedTimer來計算等待執行操作的已用時間。下面是代碼片段停止QThread執行

QElapsedTimer timeoutTimer; // Timer to count the elapsed time waiting for the operation to complete. 
long timeoutInterval=10000 
MyThread mThread(); // QThread implementation 
timeoutTimer.start(); 
mThread.start(); 

while((timeoutTimer.elapsed() < timeoutInterval) && mThread.isRunning()){ 
    sleep(5); 
} 


if(mThread.isRunning()){ 
    mThread.terminate(); 
} 

現在,如果沒有完成任務,併發生超時,我得到「摧毀,線程仍在運行」和應用程序時墜毀。 我試着調用QThread的terminate()函數,但是它在Windows上工作,但是在Linux上我得到了段錯誤。

回答

1

嘗試使用void QThread::quit()在文檔

Tells the thread's event loop to exit with return code 0 (success). Equivalent to calling QThread::exit(0). 
This function does nothing if the thread does not have an event loop. 
+0

我試過'quit()'而不是'terminate',但它沒有工作。 – Vinod

3

你剛纔提到,quit()不適合你的工作線程提到,所以我想你已經重新實現QThread::run方法,在你實現不使用事件循環。如文檔所述:

子類化QThread在大多數情況下不是必需的,因爲QThread 提供了全功能的線程管理功能。然而, 如果您希望實施高級線程 管理,QThread可以被分類。這是通過向 子類添加新成員函數和/或通過重新實現run()來完成的。 QThread的run()函數類似於應用程序的main()函數,它是 - 它在線程啓動時執行,並且線程在返回時結束。

注:之前Qt的4.4,使用的QThread用於並行處理 的唯一方法是子類它和實施 運行內部的處理代碼()。這種做法現在被認爲是不好的做法;一個QThread應該只管理一個線程,而不是處理數據。

所以,不要繼承QThread。您可以使用標準事件循環和信號插槽系統來使用您的線程。如果您的任務可以完成,您還可以使用更多的高級界面,例如QRunnable

如果您確定要重新實現QThread::run並消除事件循環的優點,則應該小心手動停止線程。例如,您可以使用一些布爾標誌bool need_to_stop,並在線程運行時定期檢查其值。當您決定停止線程時,將標誌的值設置爲true,然後調用QThread::wait()。當QThread::run由於該標誌的值而結束時,您的線程將被停止並且wait()將返回。但請注意,您不能在新線程和GUI線程中同時使用一個標誌。您需要一些同步機制,如QMutex。所以,這件事情太複雜了。如果你不想做低級別的事情,就不要繼承QThread。