qt 執行緒類是本文介紹的內容,qt對執行緒的支援已經有很多年了(發布於2023年九月22日的qt2.2引入了qthread類),qt4.0版本的release則對其所有所支援平台預設地是對多執行緒支援的。(當然你也可以關掉對執行緒的支援,參見這裡)。現在qt提供了不少類用於處理執行緒,讓你我們首先預覽一下:
qthread
qthread是qt中乙個對執行緒支援的核心的底層類。每個執行緒物件代表了乙個執行的執行緒。由於qt的跨平台特性,qthread成功隱藏了所有在不同作業系統裡使用執行緒的平台相關性**。為了運用qthread從而讓**在乙個執行緒裡執行,我們可以建立乙個qthread的子類,並過載qthread::run() 方法:
class thread : public qthread
}; 接著,我們可以使用:
class thread : public qthread
}; 來真正的啟動乙個新的執行緒。 請注意,qt4.4版本之後,qthread不再支援抽象類;現在虛函式qthread::run()實際上是簡單呼叫了qthread::exec(),而它啟動了執行緒的事件迴圈。(更多資訊見後文)
qrunnable 和 qthreadpool
qrunnable [doc.qt.nokia.com] 是一種輕量級的、以「run and forget」方式來在另乙個執行緒開啟任務的抽象類,為了實現這一功能,我們所需要做的全部事情是派生qrunnable類,並實現純虛函式方法run()
class task : public qrunnable
}; 事實上,我們是使用qthreadpool類來執行乙個qrunnable 物件,它維護了乙個執行緒池。通過呼叫qthreadpool::start(runnable) ,我們把乙個qrunnable 放入了qthreadpool的執行佇列中;只要執行緒是可見得,qrunnable 將會被拾起並且在那個執行緒裡執行。儘管所有的qt應用程式都有乙個全域性的執行緒池,且它是通過呼叫 qthreadpool::globalinstance()可見得,但我們總是顯式地建立並管理乙個私有的qthreadpool 例項。請注意,qrunnable 並不是乙個qobject類,它並沒有乙個內建的與其他元件顯式通訊的方法。你必須使用底層的執行緒原語(比如收集結構的枷鎖保護佇列等)來親自編寫**。
qtconcurrent
qtconcurrent 是乙個構建在qthreadpool之上的上層api,它用於處理最普通的平行計算模式:map [en.wikipedia.org], reduce [en.wikipedia.org], and filter [en.wikipedia.org] 。同時,qtconcurrent::run()方法提供了一種便於在另乙個執行緒執行乙個函式的方法。不像qthread以及qrunnable,qtconcurrent 沒有要求我們使用底層的同步原語,qtconcurrent 所有的方法會返回乙個qfuture 物件,它包含了結果而且可以用來查詢執行緒計算的狀態(它的進度),從而暫停、繼續、取消計算。qfuturewatcher 可以用來監聽乙個qfuture 進度,並且通過訊號和槽與之互動(注意qfuture是乙個基於數值的類,它並沒有繼承自qobject).
功能比較
訊號槽QT中訊號和槽淺淺淡淡
時間緊張,先記一筆,後續優化與完善。全部從 qobject 或其子類 例如 qwidget 派生的類都夠能包括訊號和槽。當物件變改其態狀時,訊號就由該物件發射 emit 出去,這就是物件所要做的部全情事,它不曉得另一端是誰在接收這個訊號。這就是真正的資訊封裝,它確保物件被作當乙個真正的軟體元件來應用...
QT執行緒(一) 執行緒類
執行緒之間共享資料,但又單獨執行 qt執行緒 qthread 是平台無關的 通常主線程從 main 開始執行,而在主線程中建立其他執行緒,其他執行緒派生於 qthread 1 執行緒優先順序總共8 個優先順序 執行緒優先順序從上到下越來越高。constant value description qt...
QT執行緒(一) 執行緒類
執行緒之間共享資料,但又單獨執行 qt執行緒qthread是平台無關的 通常主線程從main開始執行,而在主線程中建立其他執行緒,其他執行緒派生於qthread 1 執行緒優先順序 總共8個優先順序 執行緒優先順序從上到下越來越高。constant value description qthread...