最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt 中線程池QRunnable和QThreadPool的使用

 更新時(shí)間:2025年07月14日 10:22:02   作者:追烽少年x  
本文主要介紹了Qt 中的線程池QRunnable和QThreadPool的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、QThreadPool類介紹

QThreadPool 是 Qt 框架中用于管理線程池的類,它提供了一種高效的方式來管理和復(fù)用線程,避免頻繁創(chuàng)建和銷毀線程帶來的開銷。

1.基本概念

QThreadPool 是一個(gè)全局的線程池,它維護(hù)了一組線程,并將任務(wù)分配給這些線程執(zhí)行。線程池中的線程數(shù)量可以通過設(shè)置最大線程數(shù)來控制。當(dāng)線程池中的線程被占用時(shí),新任務(wù)會(huì)被排隊(duì)等待執(zhí)行。

2.創(chuàng)建和使用線程池

Qt 提供了一個(gè)全局線程池 QThreadPool::globalInstance(),可以直接使用,也可以創(chuàng)建自己的線程池實(shí)例。

全局線程池的使用:

// 獲取全局線程池
QThreadPool *threadPool = QThreadPool::globalInstance();
// 設(shè)置最大線程數(shù)(可選)
threadPool->setMaxThreadCount(4);

自定義線程池的使用:

QThreadPool *myThreadPool = new QThreadPool();
myThreadPool->setMaxThreadCount(8); // 設(shè)置最大線程數(shù)

3.關(guān)鍵方法

以下是 QThreadPool 的一些常用方法:

(1) 設(shè)置線程池的最大線程數(shù)

void QThreadPool::setMaxThreadCount(int maxThreadCount);

用于設(shè)置線程池中允許的最大線程數(shù)。默認(rèn)值通常是系統(tǒng)核心數(shù)的兩倍。

(2) 啟動(dòng)任務(wù)

void QThreadPool::start(QRunnable *runnable);

將一個(gè) QRunnable 對(duì)象提交到線程池中執(zhí)行。

(3) 等待所有任務(wù)完成

void QThreadPool::waitForDone();

阻塞當(dāng)前線程,直到線程池中的所有任務(wù)都完成。

(4) 獲取全局線程池

static QThreadPool *QThreadPool::globalInstance();

返回全局線程池實(shí)例,通常用于共享程線池。

4.注意事項(xiàng)

  1. 線程安全QThreadPool 是線程安全的,可以在多個(gè)線程中同時(shí)調(diào)用其方法。
  2. 任務(wù)的生命周期:任務(wù)對(duì)象(QRunnable 的子類)通常由線程池管理,任務(wù)完成后會(huì)被自動(dòng)刪除。如果需要手動(dòng)管理任務(wù)對(duì)象的生命周期,可以在任務(wù)類中重寫 autoDelete() 方法。
  3. 任務(wù)隊(duì)列:當(dāng)線程池中的線程被占用時(shí),新任務(wù)會(huì)被放入隊(duì)列中等待執(zhí)行。
  4. 線程池的銷毀:當(dāng)線程池被銷毀時(shí),所有未完成的任務(wù)會(huì)被取消,線程池中的線程也會(huì)被銷毀。

二、QRunnable類介紹

QRunnable 是 Qt 框架中用于表示可運(yùn)行任務(wù)的類,它是線程池(QThreadPool)中任務(wù)的接口。通過繼承 QRunnable 并重寫其 run() 方法,可以創(chuàng)建一個(gè)可以在單獨(dú)線程中執(zhí)行的任務(wù)。QRunnable 是 Qt 實(shí)現(xiàn)線程池任務(wù)調(diào)度的核心機(jī)制之一。

1. QRunnable 的作用

QRunnable 是一個(gè)抽象類,用于表示一個(gè)可以被線程執(zhí)行的任務(wù)。它的主要目的是將任務(wù)封裝為一個(gè)對(duì)象,然后通過線程池(QThreadPool)或其他線程管理機(jī)制來執(zhí)行這些任務(wù)。QRunnable 的設(shè)計(jì)使得任務(wù)的創(chuàng)建和執(zhí)行解耦,從而提高了代碼的可維護(hù)性和可擴(kuò)展性。

2. QRunnable 的基本用法

要使用 QRunnable,通常需要執(zhí)行以下步驟:

1繼承 QRunnable:創(chuàng)建一個(gè)繼承自 QRunnable 的類。

2.重寫 run() 方法:在 run() 方法中實(shí)現(xiàn)任務(wù)的邏輯。

3.提交任務(wù)到線程池:通過 QThreadPool 的 start() 方法將任務(wù)提交到線程池中執(zhí)行。

3. QRunnable 的關(guān)鍵特性

(1) 自動(dòng)刪除

QRunnable 提供了一個(gè) autoDelete() 方法,用于控制任務(wù)對(duì)象在執(zhí)行完成后是否自動(dòng)刪除。默認(rèn)情況下,autoDelete() 返回 true,表示任務(wù)對(duì)象會(huì)在執(zhí)行完成后自動(dòng)刪除。如果需要手動(dòng)管理任務(wù)對(duì)象的生命周期,可以在任務(wù)類中重寫 autoDelete() 方法。

bool QRunnable::autoDelete() const;

(2) 設(shè)置優(yōu)先級(jí)

QRunnable 允許設(shè)置任務(wù)的優(yōu)先級(jí),優(yōu)先級(jí)高的任務(wù)會(huì)優(yōu)先執(zhí)行。

void QRunnable::setAutoDelete(bool autoDelete);
void QRunnable::setPriority(QThread::Priority priority);

(3) 線程安全

QRunnable 是線程安全的,可以在多個(gè)線程中同時(shí)創(chuàng)建和提交任務(wù)。

4. QRunnable 的應(yīng)用場(chǎng)景

QRunnable 適用于以下場(chǎng)景:

1.并發(fā)任務(wù):需要在多個(gè)線程中并發(fā)執(zhí)行任務(wù)時(shí),QRunnable 是一個(gè)很好的選擇。

2.線程池管理:通過 QThreadPool 和 QRunnable,可以高效地管理線程池中的任務(wù),避免頻繁創(chuàng)建和銷毀線程。

3.簡(jiǎn)化線程管理:QRunnable 將任務(wù)封裝為對(duì)象,使得任務(wù)的創(chuàng)建和執(zhí)行更加清晰和易于管理。

5. QRunnable 和 QThread 的區(qū)別

雖然 QRunnableQThread 都可以用于多線程編程,但它們的用途和設(shè)計(jì)目標(biāo)有所不同:

  • QThread:
    • 是一個(gè)完整的線程類,提供了對(duì)線程生命周期的精細(xì)控制。
    • 適用于需要長(zhǎng)期運(yùn)行的線程,或者需要手動(dòng)管理線程生命周期的場(chǎng)景。
    • 使用起來相對(duì)復(fù)雜,需要手動(dòng)啟動(dòng)和停止線程。
  • QRunnable:
    • 是一個(gè)任務(wù)類,用于表示一個(gè)可以在單獨(dú)線程中執(zhí)行的任務(wù)。
    • 通常與 QThreadPool 配合使用,適用于短時(shí)間任務(wù)的并發(fā)執(zhí)行。
    • 使用起來相對(duì)簡(jiǎn)單,任務(wù)完成后會(huì)自動(dòng)刪除。

三、使用示例

下面通過一個(gè)代碼示例來講述如何使用:

#include <QCoreApplication>
#include <QThreadPool>
#include <QRunnable>
#include <QThread>
#include <QDebug>

class QMyTask:public QRunnable
{
public:
    QMyTask(int nID)
    {
        m_nID = nID;
    }

    ~QMyTask(){};

    virtual void run() override
    {
        qDebug() << "Task"<< m_nID << "Is Run On Thread" << QThread::currentThreadId();
        QThread::sleep(2); // 模擬耗時(shí)任務(wù)
        qDebug() << "Task" << m_nID << "finished";
    }

private:
    int m_nID;
};


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    
    QThreadPool* pThreadPool = QThreadPool::globalInstance();
    pThreadPool->setMaxThreadCount(4);

    for(int i=0;i<10;i++)
    {
        QMyTask* pTask = new QMyTask(i);
        pThreadPool->start(pTask);
    }

    pThreadPool->waitForDone();

    qDebug() << "All tasks are done.";


    return a.exec();
}

代碼運(yùn)行結(jié)果:

四、總結(jié)

1.QThreadPool 提供了一種簡(jiǎn)單而高效的方式來管理線程,特別適合處理大量短時(shí)間任務(wù)的場(chǎng)景。通過合理設(shè)置線程池的大小和任務(wù)的管理方式,可以顯著提高程序的性能和響應(yīng)速度。

2.QRunnable 是 Qt 中用于表示可運(yùn)行任務(wù)的類,它通過線程池(QThreadPool)實(shí)現(xiàn)任務(wù)的并發(fā)執(zhí)行。通過繼承 QRunnable 并重寫 run() 方法,可以輕松創(chuàng)建和管理任務(wù)。QRunnable 的設(shè)計(jì)使得任務(wù)的創(chuàng)建和執(zhí)行解耦,提高了代碼的可維護(hù)性和可擴(kuò)展性。在需要并發(fā)執(zhí)行短時(shí)間任務(wù)時(shí),QRunnable 是一個(gè)非常高效的選擇。

到此這篇關(guān)于Qt 中線程池QRunnable和QThreadPool的使用的文章就介紹到這了,更多相關(guān)Qt QRunnable QThreadPool內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ 內(nèi)聯(lián)函數(shù)詳解

    C++ 內(nèi)聯(lián)函數(shù)詳解

    內(nèi)聯(lián)函數(shù)是c++為了提高程序的運(yùn)行速度做的改進(jìn),本片文章詳細(xì)介紹了C++ 的內(nèi)聯(lián)函數(shù),本文就來詳細(xì)的介紹一下,感興趣的朋友可以了解一下
    2021-11-11
  • C++之a(chǎn)ssert推薦用法及注意事項(xiàng)

    C++之a(chǎn)ssert推薦用法及注意事項(xiàng)

    這篇文章主要給大家介紹了關(guān)于C++之a(chǎn)ssert推薦用法及注意事項(xiàng)的相關(guān)資料,assert 是一個(gè)預(yù)處理宏,用于在運(yùn)行時(shí)檢查表達(dá)式是否為真,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 詳解C++賦值操作符重載

    詳解C++賦值操作符重載

    這篇文章主要介紹了C++賦值操作符重載的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • c語言中用字符串?dāng)?shù)組顯示菜單的解決方法

    c語言中用字符串?dāng)?shù)組顯示菜單的解決方法

    本篇文章是對(duì)c語言中用字符串?dāng)?shù)組顯示菜單的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn)學(xué)校運(yùn)動(dòng)會(huì)管理系統(tǒng)

    C++實(shí)現(xiàn)學(xué)校運(yùn)動(dòng)會(huì)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)校運(yùn)動(dòng)會(huì)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • C++深入探究繼承的概念與使用

    C++深入探究繼承的概念與使用

    繼承是C++面向?qū)ο缶幊讨械囊婚T。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對(duì)父類的允許訪問的方法實(shí)行的過程進(jìn)行重新編寫,返回值和形參都不能改變。就是對(duì)原本的父類進(jìn)行重新編寫,但是外部接口不能被重寫
    2022-05-05
  • C++中指針變量的使用指南

    C++中指針變量的使用指南

    本文主要介紹了C++中的指針變量,主要包括基本操作、類型、運(yùn)算、動(dòng)態(tài)內(nèi)存分配、多級(jí)指針、函數(shù)指針、與數(shù)組的使用、常量指針以及智能指針等,感興趣的可以了解一下
    2026-01-01
  • C++類和對(duì)象實(shí)例解析(二)

    C++類和對(duì)象實(shí)例解析(二)

    這篇文章主要介紹了C++類和對(duì)象,從定義出發(fā)再到實(shí)例解析,深入的理解C++類和對(duì)象,需要的朋友可以參考下
    2015-08-08
  • C語言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的定義與實(shí)現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的定義與實(shí)現(xiàn)

    隊(duì)列是一種特殊的線性表,特殊之處在于它只允許在表的前端(head)進(jìn)行刪除操作,而在表的后端(tail)進(jìn)行插入操作。本文將詳細(xì)講講C語言中隊(duì)列的定義與實(shí)現(xiàn),感興趣的可以了解一下
    2022-07-07
  • C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)

    C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)

    C++入門基礎(chǔ)篇的內(nèi)容為C++的基本特性,只有在掌握C++的基本特性后,是進(jìn)入后面類和對(duì)象學(xué)習(xí)的基礎(chǔ),下面這篇文章主要給大家介紹了關(guān)于C++入門基礎(chǔ)之命名空間、輸入輸出和缺省參數(shù)的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評(píng)論

信宜市| 息烽县| 酒泉市| 天峨县| 白河县| 陆良县| 和平区| 吉木萨尔县| 茶陵县| 乌鲁木齐市| 理塘县| 怀柔区| 蚌埠市| 景德镇市| 吐鲁番市| 定结县| 营山县| 奉节县| 岳阳县| 信阳市| 上思县| 安乡县| 嘉黎县| 林州市| 西乌珠穆沁旗| 东平县| 新泰市| 自治县| 衡山县| 蓬安县| 独山县| 太仆寺旗| 孟连| 中牟县| 香港| 额济纳旗| 江口县| 西城区| 富阳市| 长沙县| 建始县|