日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

qt qthead里如何响应信号_Qt 中的多线程技术(翻译)

發(fā)布時間:2023/12/10 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 qt qthead里如何响应信号_Qt 中的多线程技术(翻译) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文鏈接

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。