一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

3天內(nèi)不再提示

關(guān)于Qt多線程應用設(shè)計方法的總結(jié)

嵌入式小生 ? 來源:嵌入式小生 ? 2023-02-24 09:19 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、導讀

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

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

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

(1)直接實例化創(chuàng)建:提供了一個并行事件循環(huán),允許在輔助線程中調(diào)用QObject槽函數(shù)。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

七、Qt多線程應用設(shè)計方案

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

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






審核編輯:劉清

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

    關(guān)注

    68

    文章

    11063

    瀏覽量

    216478
  • 信號處理
    +關(guān)注

    關(guān)注

    48

    文章

    1055

    瀏覽量

    104000
  • GUI
    GUI
    +關(guān)注

    關(guān)注

    3

    文章

    677

    瀏覽量

    40990

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    Linux下多線程編程總結(jié)

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

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

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

    QNX環(huán)境下多線程編程

    介紹了QNX 實時操作系統(tǒng)和多線程編程技術(shù),包括線程間同步的方法、多線程程序的分析步驟、線程基本程序結(jié)構(gòu)以及實用編譯
    發(fā)表于 08-12 17:37 ?30次下載

    多線程技術(shù)在串口通信中的應用

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

    VC-MFC多線程編程詳解

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

    設(shè)計多線程和多核系統(tǒng)

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

    關(guān)于多線程編程教程及經(jīng)典應用案例的匯總分析

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

    多線程好還是單線程好?單線程多線程的區(qū)別 優(yōu)缺點分析

    摘要:如今單線程多線程已經(jīng)得到普遍運用,那么到底多線程好還是單線程好呢?單線程多線程的區(qū)別又
    發(fā)表于 12-08 09:33 ?8.2w次閱讀

    什么是多線程編程?多線程編程基礎(chǔ)知識

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

    關(guān)于Linux下多線程編程技術(shù)學習總結(jié)

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

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

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

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

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

    關(guān)于Python多進程和多線程詳解

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

    多線程如何保證數(shù)據(jù)的同步

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

    socket 多線程編程實現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程中,多線程技術(shù)被廣泛應用于提高服務器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線程技術(shù)應用于Socket編程,可以顯著提升服務器的性能。 多線程編程的基本概念 多線
    的頭像 發(fā)表于 11-12 14:16 ?965次閱讀