Qt中的线程池QThreadPool

16 篇文章 6 订阅

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。- 选自百度百科


Qt中的 QThreadPool 类管理一组 QThreads

QThreadPool 管理和回收各个 QThread 对象,以帮助减少使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局 QThreadPool 对象,可以通过调用 globalInstance() 来访问它。也可以单独创建一个 QThreadPool 对象使用。

要使用线程池中的一个线程,只需要两步:

  1. 子类化 QRunnable 并实现 run() 函数。
  2. 调用函数 start() 启动线程。

下面是一个简单的使用示例:
创建一个 QRunnable 的子类,并实现 run 函数

#include <QRunnable>
class CRunnable : public QRunnable
{
public:
    void run(void) override;
};
void CRunnable::run(void)
{
    qDebug() << "Hello Thread Pool" << ", " \
             << QThread::currentThreadId();
}

调用部分:

CRunnable* runnable = new CRunnable;
QThreadPool::globalInstance()->start(runnable);

这样就实现从线程池中取一个线程去执行任务。


  • QRunnable 对象的自动删除
    默认情况下,QThreadPool 会自动删除 QRunnable 。即上面的例子中,runnable 这个对象会在任务执行完毕后自动删除。使用 QRunnable::setAutoDelete() 来更改自动删除标记,默认为 true ,如果设置成 false ,则需要开发人员手动删除。

  • 多个 QRunnable 对象的调用
    如果想要执行多次同一个 QRunnable 对象,可以使用 tryStart() 函数;如果 QRunnable 设置自动删除 autoDeletetrue ,则该对象在最后一次调用执行完成后被释放,此时不建议多次调用 start() 函数。

  • 线程超时销毁机制
    一段时间内未使用的线程将会被销毁。默认的过期超时时间是30000毫秒(30秒)。可以使用setExpiryTimeout() 修改它。设置负过期超时将禁用过期机制,直到线程池被销毁时,该线程才会退出。

  • 设置和获取最大线程数以及获取当前激活线程数
    调用 maxThreadCount() 来查询要使用的最大线程数。如果需要,可以使用setMaxThreadCount() 更改限制。默认的 maxThreadCount()QThread::idealThreadCount() 。也就是你的电脑的CPU核心数。 activeThreadCount() 函数的作用是,返回当前正在工作的线程数。


作者:douzhq
个人博客主页:不会飞的纸飞机
文章同步页:Qt中的线程池QThreadPool

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
当然,我可以为您提供一个简单的示例来演示如何使用Qt创建线程池。以下是一个基本的Qt线程池实现: ```cpp #include <QCoreApplication> #include <QRunnable> #include <QThreadPool> #include <QDebug> // 自定义任务类 class MyTask : public QRunnable { public: MyTask(int id) : m_id(id) {} void run() override { qDebug() << "Task" << m_id << "is running in thread" << QThread::currentThreadId(); } private: int m_id; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建线程池 QThreadPool threadPool; threadPool.setMaxThreadCount(4); // 设置线程池最大线程数 // 添加任务到线程池 for (int i = 0; i < 10; ++i) { MyTask *task = new MyTask(i); threadPool.start(task); } // 当所有任务执行完毕后退出应用程序 QObject::connect(&threadPool, &QThreadPool::done, &a, &QCoreApplication::quit); return a.exec(); } ``` 在这个例子,我们首先定义了一个自定义任务类`MyTask`,继承自`QRunnable`。在`run()`函数,我们输出任务的ID和当前线程的ID。 在`main()`函数,我们创建了一个`QThreadPool`对象,并通过`setMaxThreadCount()`函数设置了线程池的最大线程数为4。然后,我们使用一个循环创建了10个任务,并通过`start()`函数将它们添加到线程池。 最后,我们使用`QThreadPool`的`done`信号连接到`QCoreApplication`的`quit`槽,以在所有任务完成后退出应用程序。 请注意,这个示例只是一个简单的演示,实际使用时可能需要根据具体需求进行更详细的参数配置和错误处理。希望这个示例能帮助到您!如果您有任何进一步的问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值