Qt 多线程之QThreadPool(qt多线程movetothread)
上述的方法需要手动建立线程,如果并发线程数量较多,而且每个线程只执行较短的任务就结束,这样就会导致线程的频繁创建和销毁,从而降低效率。因此给出另外一种做法--线程池QThreadPool。线程池的优点在于可以自动分配线程,而且可以自动对闲置的线程进行复用,提高效率。
QT为每个应用程序提供了一个全局的线程池变量对象,通过静态函数可以获取。
static QThreadPool* QThreadPool::globalInstance();
一般不需要自己创建新的线程池对象,使用该全局变量即可。得到该变量后,通过调用start()可以添加任务到线程池中,这个任务就可以被线程池处理掉了。
与上一个方法不同,进入线程池的任务对象不是继承QThread类,而是继承Qrunnabel类,然后再重写run。常用函数如下:
[pure virtual] void run();//任务写在该函数中
void setAutoDelete(bool autoDelete);//设置是否自动销毁,常设为true
建立步骤如下:
第一步:创建任务类,由于需要使用信号和槽,所以还需继承QObject,不需要则可不继承,并在构造函数中调用setAutoDelete设置是否自动销毁,建议设置为true;
Class Bubble : public QRunnabl,public QObject
第二步:在mainwindow.cpp中新建任务对象
Bubble* bubble = new Bubble;
第三步:通过线程池全局对象调用start函数添加该任务即可。
QThreadPool::globalInstance()->start(bubble);
下面是采取线程池的方法对上一示例生成的随机数进行冒泡排序和快速排序的结果