2009-08-24 81 views
1

QThread::terminate()文檔聲明不鼓勵通過調用此函數來終止線程。
在我的程序中,我需要在完成執行前終止一個線程。線程正在執行一些繁重的計算,我希望用戶能夠控制停止計算。
我該怎麼做,而不是打電話QThread::terminate()如何終止QThread?

回答

10

從線程外部設置一個標誌,該標誌由線程內的計算檢查,如果標誌已設置,則停止計算。

1

使用標誌是一種明顯而且最常用的方法,但如果您正在使用linux/unix平臺,我建議您使用管道。我遇到了同樣的問題,我使用了一個標誌(這使得代碼不可用,並且由於這種標誌導致的錯誤很難追蹤),然後我改變了實現,以使用管道,這是一種有效的方式來執行必要的操作。

如果你想,對於Linux平臺,我可以告訴你如何使用管道來終止QThread。

您也可能擁有相當於管道的窗口,但我並不瞭解太多,因爲我沒有在Windows平臺上進行大量編程。

希望這有助於

+0

我在Windows平臺,我不知道管道。 – Donotalo 2009-08-29 11:36:59

+0

@Donotalo, 管道是進程間通信(IPC)的一種形式,正如名稱所暗示的,它用於在線程之間進行通信。我使用管道消除了使用單例模式(或反模式,我應該說:-))出現的某些同步問題。 – rocknroll 2009-09-01 05:11:47

+0

iith一個標誌的問題僅僅是因爲它是一個共享的數據結構,並且必須得到充分的保護(例如'QMutex')。稍微骯髒的方法是濫用'QThread :: setPriority(QThread :: IdlePriority);'並在您的計算循環中檢查'QThread :: priority'。 – MSalters 2011-03-07 16:11:11

1

最好是使用標誌+互斥,這將使該解決方案線程安全的。