Qt 學習之路 2(73) Qt 執行緒相關類

2021-08-09 00:13:29 字數 2296 閱讀 2926

事實上,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是乙個命名空間而不是乙個類,因此其中的所有函式都是命名空間內的全域性函式。

下面我們可以對比一下上面介紹過的三種類:

特性qthreadqrunnableqtconcurrent

高階 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,文章內容更多的傾...