Qt QThreadPool线程池的实现

 更新时间:2024年04月30日 09:29:25   作者: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线程池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • C++中的类成员函数当线程函数

    C++中的类成员函数当线程函数

    这篇文章主要介绍了C++中的类成员函数当线程函数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C++与C的差异分析

    C++与C的差异分析

    这篇文章主要介绍了C++与C的差异分析,非常实用,需要的朋友可以参考下
    2014-08-08
  • C语言中进行函数指针回调的实现步骤

    C语言中进行函数指针回调的实现步骤

    在 C 语言中,函数指针的回调是一种强大的编程技术,它允许我们在特定的事件发生或特定的条件满足时,调用由用户定义的函数,这种机制增加了程序的灵活性和可扩展性,使得代码更具通用性和可重用性,本文给大家介绍了C语言中进行函数指针回调的实现步骤,需要的朋友可以参考下
    2024-07-07
  • 详解C语言位域的使用与注意事项

    详解C语言位域的使用与注意事项

    所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。下面这篇文章就给大家介绍下关于C语言中位域的使用与注意事项。
    2016-12-12
  • 详解C++编程中用数组名作函数参数的方法

    详解C++编程中用数组名作函数参数的方法

    这篇文章主要介绍了详解C++编程中用数组名作函数参数的方法,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言 二叉树的链式存储实例

    C语言 二叉树的链式存储实例

    本篇文章主要介绍C语言中二叉树的链式存储,这里提供了一个实例代码进行参考,这样对二叉树的链式存储有更深入的了解,希望能帮到学习这块知识的同学
    2016-07-07
  • c语言++放在前面和后面的区别分析

    c语言++放在前面和后面的区别分析

    在C语言中,前缀自增(++i)和后缀自增(i++)操作符并不是同一个操作符,前缀自增操作符的优先级高于后缀自增,同时得到的结果并不完全一致,因此需要区分
    2015-11-11
  • C++11返回类型后置语法的使用示例

    C++11返回类型后置语法的使用示例

    本篇文章主要介绍了C++11返回类型后置语法的使用示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • C++ Qt开发之CheckBox多选框组件的用法详解

    C++ Qt开发之CheckBox多选框组件的用法详解

    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍CheckBox单行输入框组件的使用方法,需要的朋友可以参考下
    2023-12-12
  • C++ Boost TypeTraits库使用详解

    C++ Boost TypeTraits库使用详解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11

最新评论