Qt QThreadPool线程池的实现
作者:Mr.codeee
QThreadPool管理和重新设计单个QThread对象,以帮助降低使用线程的程序中的线程创建成本,本文主要介绍了Qt QThreadPool线程池的实现,具有一定的参考价值,感兴趣的可以了解一下
1.简介
QThreadPool类管理一个QThread集合。
QThreadPool管理和重新设计单个QThread对象,以帮助降低使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用globalInstance来访问该对象。
要使用其中一个QThreadPool线程,请子类化QRunnable并实现run虚拟函数。然后创建该类的一个对象,并将其传递给QThreadPool::start。
主要特点:
- 线程复用:线程池中的线程可以重复使用,减少了线程创建和销毁的开销。
- 资源管理:线程池可以帮助管理线程的生命周期,包括线程的创建、销毁和线程数的控制。
- 任务队列:线程池通常与一个任务队列一起使用,允许你将任务添加到队列中,由线程池中的线程执行。
2.常用方法
- globalInstance(): 获取全局的
QThreadPool
实例。 - maxThreadCount(): 获取线程池中最大线程数。
- setMaxThreadCount(int): 设置线程池中最大线程数。
- activeThreadCount(): 获取当前活跃的线程数。
- expiryTimeout(): 获取线程的最长存活时间。
- setExpiryTimeout(int): 设置线程的最长存活时间。
- start(QRunnable *): 将一个
QRunnable
对象添加到线程池的任务队列中,并在线程池中的一个线程上执行它。 - tryStart(QRunnable *): 尝试立即在一个空闲线程上执行
QRunnable
对象,如果失败则返回false
。 - waitForDone(int): 阻塞调用线程,直到所有任务执行完毕或超时。
- clear(): 清空任务队列,停止所有正在执行的任务。
- releaseThread(): 通知线程池当前线程已经完成了一个任务,可以重新被使用。
3.示例
我们创建了一个简单的 QRunnable
子类 MyRunnable
,并在主函数中使用了 QThreadPool
来执行 4 个任务。我们设置了线程池的最大线程数为 4,这意味着同时最多有 4 个线程在执行任务。其他的任务会在线程池中的线程变为可用时被执行。
#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; }
运行结果:
到此这篇关于Qt QThreadPool线程池的实现的文章就介绍到这了,更多相关Qt QThreadPool线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!