一、QThreadPool 简介
QThreadPool 是 Qt 提供的用于高效管理线程资源的类。它通过线程池的方式管理和复用线程,适合处理大量、短时间运行的任务,避免频繁创建和销毁线程带来的性能开销。
常用功能:
- 管理多个可复用的工作线程;
- 接收任务并调度执行;
- 与 QRunnable 配合使用;
- 默认最大线程数为 QThread::idealThreadCount()(通常等于 CPU 核心数);
- 支持设置最大线程数、自定义线程池等。
二、常用函数简介
2.1 int QThreadPool::activeThreadCount() const
功能说明:返回当前线程池中 正在活动(运行任务) 的线程数。
应用场景:
- 实时查看线程池运行状态;
- 调试线程池任务调度情况;
- 控制提交任务的节奏(例如当前线程数未满才继续添加);
- 动态 UI 显示线程使用情况(如进度、资源消耗等)。
示例代码:
#include <QThreadPool>
#include <QDebug>
void checkActiveThreads() {
QThreadPool *pool = QThreadPool::globalInstance();
qDebug() << "当前正在运行的线程数:" << pool->activeThreadCount();
}
结合实际使用:
void addTaskIfIdle() {
QThreadPool *pool = QThreadPool::globalInstance();
if (pool->activeThreadCount() < pool->maxThreadCount()) {
// 当前有空闲线程,可以提交新任务
MyTask *task = new MyTask();
pool->start(task);
qDebug() << "已提交新任务,当前活动线程数:" << pool->activeThreadCount();
} else {
qDebug() << "线程池已满,稍后再试";
}
}
注意事项:
- 线程池是动态调度的,activeThreadCount() 的值可能在多线程环境中随时变化;
- 此函数是 线程安全的(thread-safe),可放心在多线程场景下调用;
- 并不能获取待执行任务数量(可使用 QSemaphore 或自己维护队列实现任务计数)。
2.2 void QThreadPool::clear()
功能说明:
- 从线程池中移除所有等待执行的任务(即任务队列中还未开始运行的任务);
- 不会中断正在执行的任务;
- 被清除的任务如果是 setAutoDelete(true),会自动释放内存。
使用场景:

示例代码:
#include <QThreadPool>
#include <QRunnable>
#include <QDebug>
class MyTask : public QRunnable {
public:
void run() override {
qDebug() << "正在运行任务:" << QThread::currentThread();
QThread::sleep(2); // 模拟耗时任务
}
};
void testClearThreadPool() {
QThreadPool *pool = QThreadPool::globalInstance();
pool->setMaxThreadCount(2);
// 提交5个任务
for (int i = 0; i < 5; ++i) {
MyTask *task = new MyTask();
task->setAutoDelete(true);
pool->start(task);
}
// 清除尚未开始的任务(等待队列中)
pool->clear();
qDebug() << "已清除未开始执行的任务";
}
注意事项:
- clear() 只影响还没开始运行的任务;
- 正在执行的任务不会被打断;
- 若需要中断正在运行的任务,需要:在任务中定期检查某个取消标志;使用信号控制;或使用 QThread 管理(可中断线程运行);
- 若任务未设置 setAutoDelete(true),被清除后你需要手动 delete。
2.3 int QThreadPool::expiryTimeout() const
作用:返回线程池中线程的“过期超时(expiry timeout)”值,也就是 线程空闲多久后将自动销毁。
应用背景:
- Qt 的线程池会自动回收空闲线程以减少资源消耗;
- expiryTimeout 设置了线程空闲多长时间后自动退出,防止线程常驻内存;
- 如果线程在 timeout 时间内再次有任务进来,线程会被复用;否则会被销毁,任务会由新线程执行。
常见用法:
查看线程池当前过期时间
QThreadPool *pool = QThreadPool::globalInstance();
qDebug() << "线程过期超时设置:" << pool->expiryTimeout() << "毫秒";
示例:动态查看线程池设置
#include <QThreadPool>
#include <QDebug>
void checkThreadExpiry() {
QThreadPool *pool = QThreadPool::globalInstance();
int timeout = pool->expiryTimeout();
qDebug() << "当前线程空闲超时时间为:" << timeout << "毫秒";
}
默认值说明:

使用建议:

注意事项:
- 不是任务超时控制! 而是线程空闲后多久自动销毁;
- 如果想设置任务运行超时时间,请自行实现定时器或任务取消逻辑;
- 该值仅影响线程资源生命周期,不影响任务调度本身。
2.4 int QThreadPool::maxThreadCount() const
功能说明:返回当前线程池最多能同时运行的线程数,即线程并发上限。
举例使用:
查看最大线程数
QThreadPool *pool = QThreadPool::globalInstance();
int maxThreads = pool->maxThreadCount();
qDebug() << "最大并发线程数为:" << maxThreads;
示例完整代码:
#include <QThreadPool>
#include <QDebug>
void checkMaxThreads() {
QThreadPool *pool = QThreadPool::globalInstance();
qDebug() << "系统推荐线程数:" << QThread::idealThreadCount();
qDebug() << "当前线程池最大线程数:" << pool->maxThreadCount();

最低0.47元/天 解锁文章
2691

被折叠的 条评论
为什么被折叠?



