QT執行緒的結束

2022-06-30 18:36:12 字數 1813 閱讀 5353

感謝原作者的幫助!

#include #include 

class 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 : public

qthread

~workerthread()

protected

:

virtual

void

run() q_decl_override

}};

在耗時操作中使用isinterruptionrequested()來判斷是否請求終止執行緒,如果沒有,則一直執行;當希望終止執行緒的時候,呼叫requestinterruption()即可。

正如侯捷所言:「原始碼面前,了無秘密」。如果還心存疑慮,我們不妨來看看requestinterruption()、isinterruptionrequested()的原始碼:

void

qthread::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...