色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

關于Qt多線程應用設計方法的總結

嵌入式小生 ? 來源:嵌入式小生 ? 2023-02-24 09:19 ? 次閱讀

一、導讀

本篇文章是關于Qt多線程應用設計方法的總結,描述了Qt中進行多線程設計的四種方法,并列舉了常見應用場景下的多線程設計方案。合理選擇對應的方法來解決實際開發中遇到的問題有助于對應用程序進行更合理設計。

二、【方法一】 QThread:帶有可選事件循環的底層API

QThread是Qt中所有線程的基礎,每個QThread實例代表和控制一個線程。使用QThread創建線程有兩種方法:

(1)直接實例化創建:提供了一個并行事件循環,允許在輔助線程中調用QObject槽函數。

(2)子類化創建:繼承QThread,允許應用程序在啟動事件循環之前初始化新線程,或者在沒有事件循環的情況下運行并行代碼。

三、【方法二】 QThreadPool和QRunnable:重用線程

在實際開發中,頻繁創建和銷毀線程的代價可能會很高。為了減少這種開銷,可以對新任務重用現有的線程。QThreadPool是可重用QThread的集合。

要在QThreadPool的一個線程中運行代碼,需要重新實現QRunnable::run()并實例子類化的QRunnable。

使用````QThreadPool::start()將QRunnable放到QThreadPool的運行隊列中。當線程可用時,QRunnable::run()```中的代碼將在該線程中執行。

【備注】:每個Qt應用程序都有一個全局線程池,可以通過QThreadPool::globalInstance()訪問這個線程池。這個全局線程池根據CPU中的核心數量會自動維護最佳的線程數量。但是在實際開發中,可以顯式創建和管理一個單獨的QThreadPool。

四、【方法三 】Qt并發:使用高級API

Qt并發模塊提供了許多高級功能,用來處理一些常見的并行計算模式。例如:map、filter和reduce。Qt并發與使用QThread和QRunnable不同,這些函數不需要使用底層的線程原語,如互斥或信號量等。相反,它們返回的是一個QFuture對象,該對象可用于在準備線程或者線程完成時自動檢索函數的結果;QFuture還可以用來查詢、計算進度和暫停/恢復/取消計算。更方便的是,QFutureWatcher允許通過信號和槽函數與QFutures進行交互。

Qt Concurrent的并行計算模型:map、filter和reduce等算法會自動將計算負載分配到所有可用的處理器核心上,因此,我們今天編寫的應用程序,如果在以后部署到擁有更多處理器核心的系統上時將繼續得以擴展和使用,這一點非常方便。

Qt并發模塊還提供了QtConcurrent::run()函數,它可以在另一個線程中運行任何函數。但是,QtConcurrent::run()只支持map、filter和reduce函數可用的特性子集,QFuture可用于檢索函數的返回值并檢查線程是否正在運行。

但是,對QtConcurrent::run()的調用只使用一個線程,不能暫停/恢復/取消,也不能查詢進程。

五、【方法四】 WorkerScript:QML中的線程化

WorkerScript QML類型允許JavaScript代碼與GUI線程并行運行。每個WorkerScript實例可以附加一個.js腳本。調用WorkerScript.sendMessage()時,腳本將在單獨的線程(和單獨的QML上下文)中運行。當腳本運行完成時,它可以將一個回復發送回GUI線程,該線程將調用WorkerScript.onMessage()信號處理程序。

使用WorkerScript類似于使用已移動到另一個線程的worker QObject,數據通過信號在線程之間進行傳輸。

【注】這種方法在QML中使用

六、如何選擇上述四種多線程設計方案

如上所示,Qt為開發多線程應用程序提供了幾種解決方案。而對于多線程應用程序的解決方案的選擇取決于:新線程的用途和線程的生存期。下面是Qt線程技術的一張比較表:

序號 特點 QThread QRunnable 和QThreadPool QtConcurrent::run() Qt Concurrent(Map/Filter/Reduce) WorkerScript
1 開發語言 C++ C++ C++ C++ QML
2 是否可以指定線程優先級
3 線程是否可以運行一個事件循環
4 線程是否可以通過信號接收數據更新 是(received by a worker QObject) 是 (received by WorkerScript)
5 線程是否可以使用信號來控制 是(received by QThread) 是 (received by QFutureWatcher)
6 線程是否可以通過QFuture來監控 部分可以
7 是否擁有內置能力:取消/暫停/恢復

七、Qt多線程應用設計方案

在本小節中,列出了Qt中常見的幾種多線程應用的設計方案,如下表所示:

線程生命周期 應用場景 解決方案
一次調用 在另一個線程中運行一個新的線程函數,可以選擇在運行期間進行進度更新。 Qt提供了不同的解決方案: 1、 將該函數放在QThread::run()的重新實現中,并啟動QThread,發出信號更新進度。 2、該函數放在QRunnable::run()的重新實現中,并將QRunnable添加到QThreadPool中,寫入線程安全的變量更新進度。 3、使用QtConcurrent:: Run()運行函數,寫入線程安全的變量更新進度。
一次調用 在另一個線程中運行一個現有函數并獲取它的返回值。 使用QtConcurrent:: Run()運行函數,讓QFutureWatcher在函數返回時發出finished()信號,并調用QFutureWatcher::result()來獲取函數的返回值。
一次調用 使用所有可用的硬件資源對容器(Container)的所有項執行操作。例如:從圖像列表生成縮略圖。 使用QtConcurrent的QtConcurrent::filter()函數來選擇容器元素,使用QtConcurrent::map()函數來為每個元素關聯一個操作。
一次調用/永久存在 在純QML應用程序中完成長時間的計算,并在結果準備好時更新GUI。 將計算代碼放在.js腳本中,并將其附加到WorkerScript實例。調用WorkerScript.sendMessage()在新線程中啟動計算。讓腳本也調用sendMessage(),將結果傳遞回GUI線程。在onMessage中處理結果并更新GUI。
永久存在 在另一個線程中有一個對象,它可以根據請求執行不同的任務,并且可以接收、處理新的數據。 子類化一個QObject來創建一個worker,實例化這個worker對象和一個QThread,將worker移動到新線程,通過排隊的信號和槽函數連接向worker對象發送命令或數據。
永久存在 在另一個線程中重復執行開銷較大的操作,其中該線程不需要接收任何信號或事件。 直接在QThread::run()的重新實現中寫入無限循環,在沒有事件循環的情況下啟動線程,讓線程發出信號將數據發送回GUI線程。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10899

    瀏覽量

    212609
  • 信號處理
    +關注

    關注

    48

    文章

    1040

    瀏覽量

    103358
  • GUI
    GUI
    +關注

    關注

    3

    文章

    662

    瀏覽量

    39819

原文標題:這四種使用Qt多線程設計的“姿勢”...

文章出處:【微信號:嵌入式小生,微信公眾號:嵌入式小生】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Linux下多線程編程總結

    最近研究MySQL源碼,各種鎖,各種互斥,好在我去年認真學了《unix環境高級編程》, 雖然已經忘得差不多了,但是學過始終是學過,拿起來也快。寫這篇文章的目的就是總結Linux 下多線程編程,作為日后的參考資料。
    發表于 07-23 08:17

    基于TCP/IP協議的多線程通信的基本方法

    本文給出了一種在Windows NT下基于TCP/IP協議的多線程通信的基本方法,根據該方法進行修改和擴充,便可設計出符合具體應用的高質量的多線程通信程序。
    發表于 02-04 07:08

    QNX環境下多線程編程

    介紹了QNX 實時操作系統和多線程編程技術,包括線程間同步的方法多線程程序的分析步驟、線程基本程序結構以及實用編譯
    發表于 08-12 17:37 ?30次下載

    多線程技術在串口通信中的應用

            首先介紹了多線程技術的基本原理,然后討論了多線程技術在串口通信中的應用,并給出了實現的方法和步驟。關鍵詞:
    發表于 09-04 09:10 ?18次下載

    VC-MFC多線程編程詳解

    VC編程中關于 MFC多線程編程的詳解文檔
    發表于 09-01 15:01 ?0次下載

    設計多線程和多核系統

    如果您的微控制器應用程序需要處理數字音頻,請考慮采用多線程方法。使用多線程設計方法可以使設計者以簡單的方式重用其部分設計。
    發表于 08-14 15:42 ?9次下載
    設計<b class='flag-5'>多線程</b>和多核系統

    關于多線程編程教程及經典應用案例的匯總分析

    多處理機、多核心處理器以及芯片級多處理或同時多線程處理器。本文為大家介紹多線程在Linux環境下的編程及在實際環境中的應用。 多線程技術在數據實時采集分析中的應用 本文介紹的多線程、內
    發表于 10-16 16:46 ?0次下載

    多線程好還是單線程好?單線程多線程的區別 優缺點分析

    摘要:如今單線程多線程已經得到普遍運用,那么到底多線程好還是單線程好呢?單線程多線程的區別又
    發表于 12-08 09:33 ?8.1w次閱讀

    什么是多線程編程?多線程編程基礎知識

    摘要:多線程編程是現代軟件技術中很重要的一個環節。要弄懂多線程,這就要牽涉到多進程。本文主要以多線程編程以及多線程編程相關知識而做出的一些結論。
    發表于 12-08 16:30 ?1.3w次閱讀

    關于Linux下多線程編程技術學習總結

    Linux下多線程編程技術 作為一個IT人員,不斷的學習和總結是我們這個職業習慣,所以我會將每個階段的學習都會通過一點的總結來記錄和檢測自己的學習效果,今天為大家總結
    發表于 04-22 03:12 ?2220次閱讀
    <b class='flag-5'>關于</b>Linux下<b class='flag-5'>多線程</b>編程技術學習<b class='flag-5'>總結</b>

    RT-Thread學習筆記 --(6)RT-Thread線程間通信學習過程總結

    前兩篇文章總結了RT-Thread多線程以及多線程同步的學習過程,關于前兩篇學習總結,可以查看之前的文章。
    發表于 01-25 18:50 ?7次下載
    RT-Thread學習筆記 --(6)RT-Thread<b class='flag-5'>線程</b>間通信學習過程<b class='flag-5'>總結</b>

    基于QT自制上位機(多線程

    前言:應用程序在某些情況下需要處理比較復雜的邏輯,例如常規的圖傳上位機,如果在傳輸圖片跑到較高碼流或對圖像執行一些處理任務是,引用多線程可以明顯 改善響應度和反饋速度。 QT多線程使用的注意事項
    發表于 05-09 11:47 ?1次下載
    基于<b class='flag-5'>QT</b>自制上位機(<b class='flag-5'>多線程</b>)

    關于Python多進程和多線程詳解

    進程(process)和線程(thread)是操作系統的基本概念,但是它們比較抽象,不容易掌握。關于多進程和多線程,教科書上最經典的一句話是“進程是資源分配的最小單位,線程是CPU調度
    的頭像 發表于 11-06 14:46 ?882次閱讀
    <b class='flag-5'>關于</b>Python多進程和<b class='flag-5'>多線程</b>詳解

    多線程如何保證數據的同步

    多線程編程是一種并發編程的方法,意味著程序中同時運行多個線程,每個線程可獨立執行不同的任務,共享同一份數據。由于多線程并發執行的特點,會引發
    的頭像 發表于 11-17 14:22 ?1294次閱讀

    socket 多線程編程實現方法

    在現代網絡編程中,多線程技術被廣泛應用于提高服務器的并發處理能力。Socket編程是網絡通信的基礎,而將多線程技術應用于Socket編程,可以顯著提升服務器的性能。 多線程編程的基本概念 多線
    的頭像 發表于 11-12 14:16 ?437次閱讀
    主站蜘蛛池模板: 久久精品免费电影| 伦理片天堂eeuss影院2o12| chinese国语露脸videos| 在教室伦流澡到高潮H女攻视频| 亚洲国产AV精品卡一卡二| 贤妻良母电影日本| 草久热的视频在线观看| 日本女人下面毛茸茸| 黄 色 网 站 免 费 涩涩屋| 97人人碰免费视频公开| 兽交白浆喷水高潮| 久久网站视频| 国产69精品久久久久乱码免费 | 九色91精品国产网站| 69xx欧美| 香港日本三级亚洲三级| 蜜桃视频无码区在线观看| 国产精品久久人妻无码网站一区L| 自拍黄色片| 新影音先锋男人色资源网| 欧美亚洲日韩欧洲不卡| 后式大肥臀国产在线| 超碰在线视频公开| 又爽又黄又粗又大免费视频| 少妇高潮惨叫久久久久久电影| 美女爽到嗷嗷嗷叫| 黄色三级在线| 公开超碰在线视频| 2021国产精品| 亚洲日韩视频免费观看| 色宅男午夜电影网站| 美女白虎穴| 精品欧美一区二区三区四区| 高清欧美性猛交xxxx黑人猛交| 最近2019中文字幕免费版视频| 我的年轻漂亮继坶三级| 欧美精品99久久久啪啪| 久久青草热热在线精品| 国内精品伊人久久久久| 疯狂小护士| 成 人 动漫3d 在线看|