Qt QThreadPool線程池的實(shí)現(xiàn)
1.簡介
QThreadPool類管理一個(gè)QThread集合。
QThreadPool管理和重新設(shè)計(jì)單個(gè)QThread對象,以幫助降低使用線程的程序中的線程創(chuàng)建成本。每個(gè)Qt應(yīng)用程序都有一個(gè)全局QThreadPool對象,可以通過調(diào)用globalInstance來訪問該對象。
要使用其中一個(gè)QThreadPool線程,請子類化QRunnable并實(shí)現(xiàn)run虛擬函數(shù)。然后創(chuàng)建該類的一個(gè)對象,并將其傳遞給QThreadPool::start。
主要特點(diǎn):
- 線程復(fù)用:線程池中的線程可以重復(fù)使用,減少了線程創(chuàng)建和銷毀的開銷。
- 資源管理:線程池可以幫助管理線程的生命周期,包括線程的創(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(): 獲取線程的最長存活時(shí)間。
- setExpiryTimeout(int): 設(shè)置線程的最長存活時(shí)間。
- start(QRunnable *): 將一個(gè)
QRunnable對象添加到線程池的任務(wù)隊(duì)列中,并在線程池中的一個(gè)線程上執(zhí)行它。 - tryStart(QRunnable *): 嘗試立即在一個(gè)空閑線程上執(zhí)行
QRunnable對象,如果失敗則返回false。 - waitForDone(int): 阻塞調(diào)用線程,直到所有任務(wù)執(zhí)行完畢或超時(shí)。
- clear(): 清空任務(wù)隊(duì)列,停止所有正在執(zhí)行的任務(wù)。
- releaseThread(): 通知線程池當(dāng)前線程已經(jīng)完成了一個(gè)任務(wù),可以重新被使用。
3.示例
我們創(chuàng)建了一個(gè)簡單的 QRunnable 子類 MyRunnable,并在主函數(shù)中使用了 QThreadPool 來執(zhí)行 4 個(gè)任務(wù)。我們設(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中的類成員函數(shù)當(dāng)線程函數(shù)
這篇文章主要介紹了C++中的類成員函數(shù)當(dāng)線程函數(shù),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
C語言中進(jìn)行函數(shù)指針回調(diào)的實(shí)現(xiàn)步驟
在 C 語言中,函數(shù)指針的回調(diào)是一種強(qiáng)大的編程技術(shù),它允許我們在特定的事件發(fā)生或特定的條件滿足時(shí),調(diào)用由用戶定義的函數(shù),這種機(jī)制增加了程序的靈活性和可擴(kuò)展性,使得代碼更具通用性和可重用性,本文給大家介紹了C語言中進(jìn)行函數(shù)指針回調(diào)的實(shí)現(xiàn)步驟,需要的朋友可以參考下2024-07-07
詳解C++編程中用數(shù)組名作函數(shù)參數(shù)的方法
這篇文章主要介紹了詳解C++編程中用數(shù)組名作函數(shù)參數(shù)的方法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09
C++ Qt開發(fā)之CheckBox多選框組件的用法詳解
Qt是一個(gè)跨平臺(tái)C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺(tái)窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹CheckBox單行輸入框組件的使用方法,需要的朋友可以參考下2023-12-12

