QThreadPool管理一组线程。它负责管理和回收单个QThread对象以减少程序中线程创建的开销。每个Qt应用程序都有一个全局的QThreadPool对象,可通过方法globalInstance()获得。
为了调用QThreadPool中的一个线程,需要提供一个从QRunnable继承过来的类,并实现其中的run方法。然后创建一个该类的对象,传递给QThreadPool::start()方法。代码片断如下:
- class HelloWorldTask : public QRunnable
- {
- void run()
- {
- qDebug() << "Hello world from thread" << QThread::currentThread();
- }
- }
- HelloWorldTask *hello = new HelloWorldTask();
- // QThreadPool takes ownership and deletes 'hello' automatically
- QThreadPool::globalInstance()->start(hello);
默认情况下, QThreadPool自动删除QRunnable对象。使用QRunnable::setAutoDelete()方法可以改变该默认行为。QThreadPool支持在QRunnable::run方法中通过调用tryStart(this)来多次执行相同的QRunnable。当最后一个线程退出run函数后,如果autoDelete启用的话,将删除QRunnable对象。在autoDelete启用的情况下,调用start()方法多次执行同一QRunnable会产生竞态,就避免这样做。
那些在一定时间内会使用的线程将会过期。默认的过期时间是30秒。可通过setExpiryTimeout()方法来设置。设置一个负数的超时值代表禁用超时机制。
方法maxThreadCount()可以查询可使用的最大线程数,你也可以设置最大的线程数。
activeThreadCount反应的是当前正在被使用中的线程数个数。
reserveThread函数保留某个线程为外部使用,releaseThread释放该线程,这样就可以被再次使用。
来源:https://blog.csdn.net/myths_0/article/details/11262493