qt qthead里如何响应信号_Qt 中的多线程技术(翻译)
原文鏈接
Multithreading Technologies in Qt?doc.qt.io正文
Qt 提供一系列的類與函數(shù)來處理多線程。Qt 開發(fā)者們可以使用下面四種方法來實現(xiàn)多線程應(yīng)用。
QThread: 底層 API 與可選的事件循環(huán)
作為 Qt 進行線程控制的基石,每一個 QThread 實例都代表并控制著一個線程。
您可以直接實例化 QThread,或建立子類。實例化一個 QThread 將附帶一個并行事件循環(huán),允許 QObject 槽函數(shù)在子線程執(zhí)行。若子類化一個 QThread,程序可以在事件循環(huán)啟動前初始化這個新線程;或者在無事件循環(huán)下運行并行代碼。
另請參閱: QThread 類文檔 以及示例代碼 多線程范例 來了解如何使用 QThread。
QThreadPool 與 QRunnable: 線程重用
如果頻繁地創(chuàng)建與銷毀線程,資源開銷將會非常大。為了減少這樣額外的開銷,可以重復(fù)使用一些現(xiàn)成的線程來執(zhí)行新的任務(wù)。QThreadPool 就是這樣一個保存著可重用的 QThead 的集合。
為了將代碼放入 QThreadPool 的線程中運行,可以重寫 QRunnable::run() 函數(shù)并實例化繼承自 QRunnable 的子類。調(diào)用 QThreadPool::start() 函數(shù)可將 QRunnable 添加到 QThreadPool 的運行隊列。一旦出現(xiàn)了一個可用的線程,它將會執(zhí)行 QRunnable::run() 里的代碼。
每一個 Qt 程序都會自帶一個公共線程池,可以通過調(diào)用 QThreadPool::globalInstance() 來獲取。公共線程池會自動維持著一定數(shù)量的線程,線程數(shù)為基于 CPU 核心數(shù)計算的最佳值。不過,您也可以顯式創(chuàng)建并管理一個獨立的 QThreadPool 。
Qt Concurrent: 使用高層 API
Qt Concurrent 模塊提供了數(shù)個高級函數(shù),用于處理一些常見的并行計算模式:map、filter 和 reduce。不同于使用 QThread 與 QRunnable,這些高級函數(shù)不需要使用底層線程原語,比如互斥鎖與信號量。取而代之的是返回一個 QFuture 對象,它能夠在傳入的函數(shù)返回值就緒后檢索該結(jié)果。QFuture 既可以用來查詢計算進度,也可以暫停/恢復(fù)/取消計算。方便起見,QFutureWatcher 可以讓您通過信號槽與 QFuture 進行交互。
Qt Concurrent 的 map、filter 和 reduce 算法會自動將計算過程分配到可用的處理器核心,由此,當(dāng)下編寫的程序在以后部署到更多核心的系統(tǒng)上時會被自動擴展。
此模塊還提供了 QtConcurrent::run() 函數(shù),可以將任何函數(shù)在另一個線程中運行。不過,QtConcurrent::run() 僅提供 map 、 filter 和 reduce 函數(shù)的一部分功能。QFuture 可以用于檢索函數(shù)返回值,也可以用于查看線程是否處于運行中。然而,調(diào)用 QtConcurrent::run() 時只會使用一個線程,并且無法暫停/恢復(fù)/取消,也不能查詢計算進度。
另請參閱: Qt Concurrent 模塊文檔以獲取各個函數(shù)的詳細信息。
WorkerScript: QML中的多線程
QML 類型 WorkerScript 可將 JavaScript 代碼與 GUI 線程并行運行。
每個 WorkerScript 實例可附加一個 .js 腳本。當(dāng)調(diào)用 WorkerScript.sendMessage() 時,腳本將會運行在一個獨立的線程中(伴隨一個獨立的 QML 上下文)。在腳本運行結(jié)束后,WorkerScript 將會向 GUI 線程發(fā)送回復(fù),后者會調(diào)用 WorkerScript.onMessage() 信號處理函數(shù)。
使用 WorkerScript,很像使用一個移入子線程工作的 QObject,數(shù)據(jù)通過信號槽在線程間進行傳輸。
另請參閱:WorkerScript 文檔以獲得實現(xiàn)腳本的詳細信息,以及能夠在線程間傳輸?shù)臄?shù)據(jù)類型列表。
選擇合適的方法
如上文所述,Qt 提供了開發(fā)多線程應(yīng)用的不同解決方案。對一個給定的程序,需要根據(jù)新線程的用途與線程的生命周期來決定正確的方案。下面是一組 Qt 多線程技術(shù)的功能對比表,以及對于一些范例較為推薦的解決方案。
解決方案對比
示例用例
相關(guān)推薦
Qt 中文文檔?github.com總結(jié)
以上是生活随笔為你收集整理的qt qthead里如何响应信号_Qt 中的多线程技术(翻译)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拦截器,利用拦截器进行登陆权限控制
- 下一篇: 顺序栈,链栈