QT 執行緒之 moveToThread()

2021-08-10 22:43:59 字數 1195 閱讀 2583

直接進入主題:

基本用法,新建乙個widget類(父類無要求) ,在此基礎上新建乙個testthread(必須繼承自 qobject),

在widget類建構函式裡做如下處理:

m_testthread = new testthread();

m_thread = new qthread();

m_testthread ->movetothread(m_thread);

m_thread->start();//以上是必須滴

connect(this,signal(startthread()),m_testthread ,slot(threadstart()));

emit startthread(); //傳送訊號,執行槽函式threadstart()

int i= 0;

while(1)

結論一:

可以發現,主線程並沒有因為threadstart()的死迴圈而被阻塞,兩段**是執行在不同的執行緒中。

結論二:

如果將上述emit startthread(); 改為 m_mainthread->threadstart();

即直接呼叫函式的方式,而非槽函式。結果如下:

可以看出:通過呼叫函式的方式時,主線程被阻塞,也就是說,呼叫的函式沒有執行在另乙個執行緒中,而是在主線程。

說明:

1. 執行緒函式的 while迴圈結束 並不代表 執行緒結束

2.m_thread->isrunning() 可以判斷 執行緒是否在執行

3.m_thread->isfinished() 可以判斷 執行緒 是否結束

4.started() 執行緒被start時觸發的訊號

5.finished() 執行緒被stop時觸發的訊號

6.執行緒退出的方法

m_thread->quit();

m_thread->exit();

兩者異同暫不討論

7.等待執行緒結束,即阻塞

m_thread->wait()

三十九 Qt 多執行緒使用moveToThread

1.從qobject派生乙個類,將耗時的工作寫在該類的槽函式中。2.將派生類物件移動到乙個qthread中,該執行緒需要start。這一步使用movetothread 3.通過訊號連線派生類的槽函式,並通過訊號觸發槽函式。槽函式在子執行緒中執行 ifndef worker h define work...

Qt 多執行緒之 std thread 一

不時見到有人會這樣做 那麼,如何使用pthread,而又使用qt提供的執行緒間機制呢?本文的初衷源於此,但是使用的的是c 0x 的 std thread,而不是直接使用unix的pthread。既然用qt,還是盡量保證誇平台吧 不想寫太多的文字,還是用乙個乙個的小例子來說話吧。int main in...

Qt多執行緒之死鎖

目錄 一 造成死鎖的原因 現象分析 二 死鎖的概念和發生條件 三 死鎖的避免 四 避免死鎖的示例 一般性原則,每個臨界資源都需要乙個執行緒鎖來進行保護,假設有多個執行緒鎖該怎麼設計程式呢?先來看以下的乙個示例 很簡單就不加注釋了 qmutex g mutex 1 qmutex g mutex 2 c...