chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

一、導(dǎo)讀

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

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

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

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

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

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

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

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

使用````QThreadPool::start()將QRunnable放到QThreadPool的運(yùn)行隊(duì)列中。當(dāng)線程可用時(shí),QRunnable::run()```中的代碼將在該線程中執(zhí)行。

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

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

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

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

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

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

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

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

使用WorkerScript類似于使用已移動(dòng)到另一個(gè)線程的worker QObject,數(shù)據(jù)通過信號(hào)在線程之間進(jìn)行傳輸。

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

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

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

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

七、Qt多線程應(yīng)用設(shè)計(jì)方案

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

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






審核編輯:劉清

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

    關(guān)注

    68

    文章

    11065

    瀏覽量

    216559
  • 信號(hào)處理
    +關(guān)注

    關(guān)注

    48

    文章

    1055

    瀏覽量

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

    關(guān)注

    3

    文章

    677

    瀏覽量

    41021

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

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

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

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

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

    VC-MFC多線程編程詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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