qt QRunnable 与 QThreadPool详解
1. 概述
QRunnable是所有runnable对象的基类,它表示一个任务或要执行的代码。开发者需要子类化QRunnable并重写其run()函数来实现具体的任务逻辑。而QThreadPool则是一个管理QThread集合的类,它帮助减少创建线程的成本,通过管理和循环使用单独的QThread对象来执行任务队列中的任务。每个Qt应用程序都有一个全局QThreadPool对象,可以通过调用globalInstance()来访问。
2. 重要方法
-
QRunnable类
run()
: 这是一个纯虚函数,需要子类化QRunnable并实现这个函数来定义任务的具体行为。- setAutoDelete(bool autoDelete):设置任务执行完成后是否自动删除对象。
- autoDelete()const:返回任务是否自动删除对象。
-
QThreadPool类
globalInstance()
: 获取全局QThreadPool对象的静态方法。start(QRunnable *runnable, int priority = 0)
: 启动一个新的任务。runnable参数是要执行的任务对象,priority参数用于设置任务的优先级。如果runnable的autoDelete属性为true,则QThreadPool会在任务执行完毕后自动删除runnable对象。tryStart(QRunnable *runnable)
: 尝试立即启动一个任务。如果没有可用的线程,则此函数不执行任何操作并返回false。waitForDone(int msecs = -1)
: 等待所有任务完成并从线程池中删除所有线程。msecs参数指定了最多等待的毫秒数,如果为-1(默认值),则忽略超时,直到最后一个线程退出。activeThreadCount()
: 返回当前正在工作的线程数量。maxThreadCount()
: 返回线程池允许的最大线程数量。setMaxThreadCount(int maxThreads)
: 设置线程池允许的最大线程数量。setExpiryTimeout(int expiryTimeout)
: 设置线程在未使用时到期的超时时间(毫秒)。默认值是30000毫秒(30秒)。
#include <QCoreApplication>
#include <QThreadPool>
#include <QRunnable>
#include <QDebug>
#include <QThread>
// 定义一个QRunnable的子类
class MyTask : public QRunnable
{
public:
void run() override
{
qDebug() << "MyTask is running in thread:" << QThread::currentThread();
// 在这里执行具体的任务逻辑
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 获取全局QThreadPool对象
QThreadPool *threadPool = QThreadPool::globalInstance();
// 创建一个MyTask对象并启动它
MyTask *task = new MyTask();
threadPool->start(task);
// 等待所有任务完成(在这个简单示例中,我们只有一个任务)
threadPool->waitForDone();
return a.exec();
}
觉得有帮助的话,打赏一下呗。。