事實上,qt 對執行緒的支援可以追溯到2023年9月22日發布的 qt 2.2。在這個版本中,qt 引入了qthread
。不過,當時對執行緒的支援並不是預設開啟的。qt 4.0 開始,執行緒成為所有平台的預設開啟選項(這意味著如果不需要執行緒,你可以通過編譯選項關閉它,不過這不是我們現在的重點)。現在版本的 qt 引入了很多類來支援執行緒,下面我們將開始逐一了解它們。
qthread
是我們將要詳細介紹的第乙個類。它也是 qt 執行緒類中最核心的底層類。由於 qt 的跨平台特性,qthread
要隱藏掉所有平台相關的**。
正如前面所說,要使用qthread
開始乙個執行緒,我們可以建立它的乙個子類,然後覆蓋其qthread::run()
函式:
c++
1
2
3
4
5
6
7
8
class
thread
:public
qthread
};
然後我們這樣使用新建的類來開始乙個新的執行緒:
c++
1
2
thread
*thread
=new
thread;
thread
->
start()
;// 使用 start() 開始新的執行緒
注意,從 qt 4.4 開始,qthread
就已經不是抽象類了。qthread::run()
不再是純虛函式,而是有了乙個預設的實現。這個預設實現其實是簡單地呼叫了qthread::exec()
函式,而這個函式,按照我們前面所說的,其實是開始了乙個事件迴圈(有關這種實現的進一步闡述,我們將在後面的章節詳細介紹)。
qrunnable
是我們要介紹的第二個類。這是乙個輕量級的抽象類,用於開始乙個另外執行緒的任務。這種任務是執行過後就丟棄的。由於這個類是抽象類,我們需要繼承qrunnable
,然後重寫其純虛函式qrunnable::run()
:
c++
12
3
4
5
6
7
8
class
task
:public
qrunnable
}; 要真正執行乙個qrunnable
物件,我們需要使用qthreadpool
類。顧名思義,這個類用於管理乙個執行緒池。通過呼叫qthreadpool::start(runnable)
函式,我們將乙個qrunnable
物件放入qthreadpool
的執行佇列。一旦有執行緒可用,執行緒池將會選擇乙個qrunnable
物件,然後在那個執行緒開始執行。所有 qt 應用程式都有乙個全域性執行緒池,我們可以使用qthreadpool::globalinstance()
獲得這個全域性執行緒池;與此同時,我們也可以自己建立私有的執行緒池,並進行手動管理。
需要注意的是,qrunnable
不是乙個qobject
,因此也就沒有內建的與其它元件互動的機制。為了與其它元件進行互動,你必須自己編寫低階執行緒原語,例如使用 mutex 守護來獲取結果等。
qtconcurrent
是我們要介紹的最後乙個物件。這是乙個高階 api,構建於qthreadpool
之上,用於處理大多數通用的平行計算模式:map、reduce 以及 filter。它還提供了qtconcurrent::run()
函式,用於在另外的執行緒執行乙個函式。注意,qtconcurrent
是乙個命名空間而不是乙個類,因此其中的所有函式都是命名空間內的全域性函式。
下面我們可以對比一下上面介紹過的三種類:
特性qthread
qrunnable
qtconcurrent
高階 api✘✘
面向任務
✘內建對暫停/恢復/取消的支援✘✘
具有優先順序
✘✘可執行事件迴圈
✘✘
Qt學習之路
qt 學習之路 是在網路上受到一定歡迎的 qt 入門教程。只是這個系列便攜與 2009 年,至今已經有三年多的時間。今天的 qt 有了很大的變化,包括 qt quick 的加入 qt 底層架構的改變,更重要的是 qt 5 的發布。本系列文章將會是 qt 學習之路 的一次公升級和修訂,著重關注於 qt...
QT學習之路
qt學習之路2 目錄 1 序2 qt 前言 3 hello,world 4 訊號槽 5 自定義訊號槽 6 qt 模組簡介 7 mainwindow 簡介 8 新增動作 9 資源檔案 10 物件模型 11 布局管理器 12 選單欄 工具欄和狀態列 13 對話方塊簡介 14 對話方塊資料傳遞 15 標準...
Qt學習之路
多年前聽說過qt的大名,但所有的探索都是淺嘗輒止並未深入了解,2020年6月,一直困擾域mfc框架的繁瑣和對windows平台的限制,下定決心學習qt,替代一直使用的mfc框架進行開發。本系列的內容是以工程實踐為主,記錄 總結我在工作過程中使用qt時的內容,目標是盡快熟練的使用qt,文章內容更多的傾...