QRunnable 是所有 runnable 对象的基类,而 QThreadPool 类用于管理 QThreads 集合。
QRunnable 类是一个接口,用于表示一个任务或要执行的代码,需要重新实现 run() 函数。
1. 例程对比:
有bug程序:
//设置最大线程数为3的一个线程池
/* QThreadPool *threadpool; // 构建一个本地的线程池
threadpool->setMaxThreadCount(3); // 线程池中最大的线程数
for (int nNum = 0; nNum <3; nNum++)
{
CRemoteFile *task; // 循环构建可在线程池中运行的任务
threadpool->start(task); //线程池分配一个线程运行该任务
qDebug()<<"Hello world from thread"<<QThread::currentThread();
QThread::msleep(1000);
}*/
改后:
CRemoteFile runObj;
QThreadPool::globalInstance()->start(&runObj);
2. QThreadpool支持多次执行相同的QRunnable,通过调用QThreadPool:tryStart(this)从run()函数内。
QThread 每次新建的一个线程都要继承QThread,来实现新类,比较麻烦;而QRunnable可直接调用对象的start()函数启动线程,并且需要借助QThreadPool
3.Debug Assertion Failed
可能因为使用了野指针,比如某个指针指向一个局部变量,而在该变量作用域之外使用该指针引用了该对象。
解决办法:
在构造函数中加入:
this->setAutoDelete(false);