感謝原作者的幫助!
#include #includeclass workerthread : public
qthread
~workerthread()
void
stop()
protected
:
virtual
void
run() q_decl_override
//locker超出範圍並釋放互斥鎖
} }
signals:
void resultready(int
value);
private
:
bool
m_bstopped;
qmutex m_mutex;
};
為什麼要加鎖?很簡單,是為了共享資料段操作的互斥。
何時需要加鎖?在形成資源競爭的時候,也就是說,多個執行緒有可能訪問同一共享資源的時候。
當主線程呼叫stop()更新m_bstopped的時候,run()函式也極有可能正在訪問它(這時,他們處於不同的執行緒),所以存在資源競爭,因此需要加鎖,保證共享資料的安全性。
二.qt5以後:requestinterruption() + isinterruptionrequested()
這兩個介面是qt5.x引入的,使用很方便:
class workerthread : publicqthread
~workerthread()
protected
:
virtual
void
run() q_decl_override
}};
在耗時操作中使用isinterruptionrequested()來判斷是否請求終止執行緒,如果沒有,則一直執行;當希望終止執行緒的時候,呼叫requestinterruption()即可。
正如侯捷所言:「原始碼面前,了無秘密」。如果還心存疑慮,我們不妨來看看requestinterruption()、isinterruptionrequested()的原始碼:
voidqthread::requestinterruption()
d->interruptionrequested = true;}
bool qthread::isinterruptionrequested() const
補充1:
對於wait並不提倡使用,為什麼?因為在不滿足return的條件之前會一直阻塞執行緒。並且qt是基於事件框架的,所以建議使用偵聽finished訊號來替代wait
補充2:
想補充一些,今天專案遇到的,就第一種方法來說,用不用鎖可以看情況,不一定必須要使用,因為在whlie裡面加鎖,有時候會因為你執行緒一直搶到鎖導致你的stop並沒有用。尤其是你很多時候會在whlie裡面加continue的情況==。如果只是主線程和這乙個執行緒使用到stop,那麼完全可以不用鎖,你最壞的情況就是while會多跑一次。就看這一次對於你的影響大還是長時間得不到鎖的影響大。就比如這段**==天坑,鬼知道我經歷了什麼
while( true)#endif
break
;
//continue;
}
m_listtextarraypicked =m_listtextarray;
listtextarray2 =m_listtextarraypicked;
m_listtextarray.clear();
}
關於qt的執行緒結束
qt為我們建立執行緒進行了包裝,呼叫qt的qthread類例項化就可以建立執行緒。inclide qthread thread 就可以建立乙個執行緒,此時執行緒建立完畢後,我們就可以啟動執行緒 執行緒的啟動呼叫的是成員函式start 執行緒啟動以後我們接下來就是重寫執行緒類的run 函式,進行具體的...
結束執行緒的方法
thread 和 runnable 1 theread是個類。run getname 方法 2 runnable是乙個介面。thread.currentthread getname runnable 建立物件方法 thread acctressthread new thread new actres...
Qt程式異常結束
解決qt程式異常結束 qt程式異常結束如下圖所示 出現這種情況一般是庫檔案載入的問題,因為程式編譯通過並且沒有報錯,然而程式卻沒有執行起來,這個時候的錯誤應該屬於鏈結庫檔案錯誤。鏈結時出錯 解決辦法 1 如果有動態庫,需要將動態庫複製到exe 執行檔案 的同一級目錄下 2 如果是靜態庫,需要在pro...