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;
}

运行结果:

4.更多推荐

libVLC 专栏介绍-CSDN博客

Qt+FFmpeg+opengl从零制作视频播放器-1.项目介绍_qt opengl视频播放器-CSDN博客

QCharts -1.概述-CSDN博客

相关推荐

  1. C-线

    2024-04-29 22:50:04       39 阅读
  2. 线

    2024-04-29 22:50:04       37 阅读
  3. 线使用

    2024-04-29 22:50:04       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 22:50:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 22:50:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 22:50:04       82 阅读
  4. Python语言-面向对象

    2024-04-29 22:50:04       91 阅读

热门阅读

  1. gt9271_update_cfg.bat

    2024-04-29 22:50:04       31 阅读
  2. 软件重构的要点及注意事项

    2024-04-29 22:50:04       31 阅读
  3. 模拟LinkedList实现的双向循环链表

    2024-04-29 22:50:04       33 阅读
  4. 服用5年份筑基丹 - Vue篇

    2024-04-29 22:50:04       26 阅读
  5. 2024年北京高校数学建模校际联赛竞赛B题

    2024-04-29 22:50:04       28 阅读
  6. 创建临时表(DM8达梦数据库)

    2024-04-29 22:50:04       33 阅读
  7. ros2小车使用slam-toolbox建图

    2024-04-29 22:50:04       101 阅读
  8. Django框架之request对象

    2024-04-29 22:50:04       115 阅读
  9. C++ day6

    C++ day6

    2024-04-29 22:50:04      27 阅读
  10. 总结4.29

    2024-04-29 22:50:04       37 阅读
  11. TCP和UDP

    2024-04-29 22:50:04       34 阅读
  12. Tcp自连接

    2024-04-29 22:50:04       29 阅读
  13. LVS/DR工作模式介绍及配置

    2024-04-29 22:50:04       26 阅读
  14. 3.Spring-依赖注入(DI)

    2024-04-29 22:50:04       38 阅读