Qt QThreadPool線程池的實(shí)現(xiàn)
1.簡(jiǎn)介
QThreadPool類管理一個(gè)QThread集合。
QThreadPool管理和重新設(shè)計(jì)單個(gè)QThread對(duì)象,以幫助降低使用線程的程序中的線程創(chuàng)建成本。每個(gè)Qt應(yīng)用程序都有一個(gè)全局QThreadPool對(duì)象,可以通過(guò)調(diào)用globalInstance來(lái)訪問(wèn)該對(duì)象。
要使用其中一個(gè)QThreadPool線程,請(qǐng)子類化QRunnable并實(shí)現(xiàn)run虛擬函數(shù)。然后創(chuàng)建該類的一個(gè)對(duì)象,并將其傳遞給QThreadPool::start。
主要特點(diǎn):
- 線程復(fù)用:線程池中的線程可以重復(fù)使用,減少了線程創(chuàng)建和銷毀的開(kāi)銷。
- 資源管理:線程池可以幫助管理線程的生命周期,包括線程的創(chuàng)建、銷毀和線程數(shù)的控制。
- 任務(wù)隊(duì)列:線程池通常與一個(gè)任務(wù)隊(duì)列一起使用,允許你將任務(wù)添加到隊(duì)列中,由線程池中的線程執(zhí)行。
2.常用方法
- globalInstance(): 獲取全局的
QThreadPool
實(shí)例。 - maxThreadCount(): 獲取線程池中最大線程數(shù)。
- setMaxThreadCount(int): 設(shè)置線程池中最大線程數(shù)。
- activeThreadCount(): 獲取當(dāng)前活躍的線程數(shù)。
- expiryTimeout(): 獲取線程的最長(zhǎng)存活時(shí)間。
- setExpiryTimeout(int): 設(shè)置線程的最長(zhǎng)存活時(shí)間。
- start(QRunnable *): 將一個(gè)
QRunnable
對(duì)象添加到線程池的任務(wù)隊(duì)列中,并在線程池中的一個(gè)線程上執(zhí)行它。 - tryStart(QRunnable *): 嘗試立即在一個(gè)空閑線程上執(zhí)行
QRunnable
對(duì)象,如果失敗則返回false
。 - waitForDone(int): 阻塞調(diào)用線程,直到所有任務(wù)執(zhí)行完畢或超時(shí)。
- clear(): 清空任務(wù)隊(duì)列,停止所有正在執(zhí)行的任務(wù)。
- releaseThread(): 通知線程池當(dāng)前線程已經(jīng)完成了一個(gè)任務(wù),可以重新被使用。
3.示例
我們創(chuàng)建了一個(gè)簡(jiǎn)單的 QRunnable
子類 MyRunnable
,并在主函數(shù)中使用了 QThreadPool
來(lái)執(zhí)行 4 個(gè)任務(wù)。我們?cè)O(shè)置了線程池的最大線程數(shù)為 4,這意味著同時(shí)最多有 4 個(gè)線程在執(zhí)行任務(wù)。其他的任務(wù)會(huì)在線程池中的線程變?yōu)榭捎脮r(shí)被執(zhí)行。
#include "widget.h" #include "ui_widget.h" #include <QRunnable> #include <QThreadPool> #include <QDebug> #include <QMutex> #include <QList> QList<int> g_list; QMutex g_mutex; class MyRunnable : public QRunnable { public: void run() override { while(true) { g_mutex.lock(); if(g_list.size() == 0) { g_mutex.unlock(); break; } qDebug() << "Task running in thread:" << QThread::currentThread() << "deal num "<<g_list.first(); g_list.pop_front(); g_mutex.unlock(); } qDebug() << "Task running in thread:" << QThread::currentThread() << "finished "; } }; Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); for(int i=0;i<20;i++) { g_list.append(i); } QThreadPool::globalInstance()->setMaxThreadCount(4); for (int i = 0; i < 4; ++i) { MyRunnable *r = new MyRunnable(); r->setAutoDelete(true); QThreadPool::globalInstance()->start(r); } } Widget::~Widget() { delete ui; }
運(yùn)行結(jié)果:
到此這篇關(guān)于Qt QThreadPool線程池的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt QThreadPool線程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言中scanf與scnaf_s函數(shù)詳解
大家好,本篇文章主要講的是C語(yǔ)言中scanf與scnaf_s函數(shù)詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01Visual Studio新建類從默認(rèn)internal改為public
本文將介紹如何將Visual Studio中的internal修飾符更改為public,以實(shí)現(xiàn)更廣泛的訪問(wèn)和重用,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09C語(yǔ)言的變量與常量 字符字符串與轉(zhuǎn)義字符詳解
這篇文章主要介紹了詳解C語(yǔ)言的變量與常量 字符字符串與轉(zhuǎn)義字符,包括其之間的區(qū)別是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2021-10-10C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易停車場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03