《QT从基础到进阶·二十》QThreadPool线程池的使用

简介: 《QT从基础到进阶·二十》QThreadPool线程池的使用

什么情况下比较适合用线程池?

比如我有上百个任务要同时处理,难道开上百个线程?NO!!!

有了线程池的加持,自动给任务分配线程处理, 多线程不再是真爱~

线程池创建:

1、自定义任务类继承QObject,QRunnable

2、重写run方法

在把任务类放进线程池后,线程池中的线程会调用任务类中的run方法执行任务。

#include <QObject>
#include <QRunnable>
class ParallelSave : public QObject, public QRunnable
{
Public:
    void run();
}

setAutoDelete(true)设置true表示这个任务对象在被线程池中的线程运行完后任务对象自动走析构销毁,不需要手动delete,设置为false表示需要手动销毁任务对象,默认为true

threadPool.setMaxThreadCount(9); //设置线程池中最多可以启动的线程数,比如设置2表示同一时间最多能启动两个线程,如果我有三个任务需要做,那同一时间只能做两个任务,剩下的一个任务需要等到两个线程中的一个线程做完上个任务才能做这个

如果有三个线程,三个任务,并不是每个线程一个任务,有可能一个线程两个任务,一个线程一个任务,还有一个线程空闲。

QThreadPool threadPool; //创建线程池对象
threadPool.setMaxThreadCount(9); //非单例,自己创建线程池对象,该线程池包含9个线程
m_paralleSave = new ParallelSave(); //创建一个可以在线程池中执行的任务对象,多个任务同时进行就要创建多个对象,在每个任务对象run方法中调用QThread::currentThread()可以查看当前任务被哪个线程ID执行。
threadPool.start(m_paralleSave); //把一个任务对象放进线程池缓存队列,等待被池中线程执行。
threadPool.activeThreadCount(); //当前线程池中正在执行任务的线程的个数,所有任务执行完毕返回0
// 线程池中被激活的线程的个数(正在工作的线程个数)
int QThreadPool::activeThreadCount() const;
int QThreadPool::waitForDone();  //阻塞当前线程池等待线程池中所有任务被线程执行完毕

注意:

线程池中setMaxThreadCount设置最大线程数为CPU逻辑核心数量,比如CPU是4核8线程,那么开8个线程可以达到最佳性能。

线程池通过调用start函数把所有任务都放置到缓存队列中,这时所有任务并不是立刻执行,线程池会根据任务数量自动创建线程,任务会被合理分配到各个线程上执行,但总线程数量不会超过设置的最大线程数。

若任务处理完毕,池内所有线程处于挂起状态,不占用CPU时间,待任务再次到来便会激活部分或全部线程处理任务。

若任务过多,当前没有空闲线程,新增任务会被放到缓存队列,等线程空闲后在进行处理。设计高性能程序时离不开线程池加持。

简单说下另一个类似线程池的应用

QFutureSynchronizer<任意类型>使用(所有线程异步执行,可以设置同步结束)和线程池很像

QFutureSynchronizer 是一个模板类,它简化了一个或多个 QFuture 对象的同步。

#include <QtConcurrent>  //问题可在属性——Qt project settings中加上

for循环让多个线程一起执行Block.addFuture中的任务,多个线程异步执行,Blcok.waitForFinished()保证所有线程全部执行完毕才跳到这一步。results保存所有线程返回的结果。

相关文章
|
6月前
|
算法 Unix 调度
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
【Qt 线程】深入探究QThread线程优先级:原理、应用与最佳实践
514 0
|
6月前
|
安全 Java
Qt经典面试题:Qt开启线程的几种方式
Qt经典面试题:Qt开启线程的几种方式
110 0
|
6月前
|
算法 Unix Linux
Linux与Qt线程优先级的对应关系:一次全面解析
Linux与Qt线程优先级的对应关系:一次全面解析
88 0
|
6月前
|
存储 并行计算 安全
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析(二)
【Qt 线程】探索Qt线程编程的奥秘:多角度深入剖析
167 0
|
6月前
|
安全 数据处理 C++
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
1381 3
|
6月前
|
存储 安全 Java
Qt线程池+生产者消费者模型
Qt线程池+生产者消费者模型
262 5
|
2月前
|
网络协议 安全
QT多线程
本文详细介绍了在Qt中如何正确使用QThread以及信号槽跨线程的使用方式,包括线程的正确退出方法和QObject在不同线程中创建子对象时可能遇到的问题。同时,文章还提供了相关博客和资料的链接,用于进一步学习和参考。
|
2月前
|
数据库 数据库管理
qt对sqlite数据库多线程的操作
本文总结了在Qt中进行SQLite数据库多线程操作时应注意的四个关键问题,包括数据库驱动加载、加锁、数据库的打开与关闭,以及QsqlQuery变量的使用。
145 1
|
2月前
自己动手写QT多线程demo
本文是作者关于如何编写Qt多线程demo的教程,介绍了如何实现多线程功能,包括可暂停和继续的功能。文章提供了部分示例代码,展示了如何创建线程类、启动和管理线程,以及线程间的通信。同时,还提供了相关参考资料和免费下载链接。
|
4月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
156 6