网站网页设计海报图片,网站设计哪家公司好,自己建一个网站需要什么,有没有做培养基的网站什么情况下比较适合用线程池#xff1f; 比如我有上百个任务要同时处理#xff0c;难道开上百个线程#xff1f;NO#xff01;#xff01;#xff01; 有了线程池的加持#xff0c;自动给任务分配线程处理#xff0c; 多线程不再是真爱~
线程池创建#xff1a; 1、自…什么情况下比较适合用线程池 比如我有上百个任务要同时处理难道开上百个线程NO 有了线程池的加持自动给任务分配线程处理 多线程不再是真爱~
线程池创建 1、自定义任务类继承QObjectQRunnable 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保存所有线程返回的结果。 博客主页 主页 欢迎点赞 收藏 ⭐留言 如有错误敬请指正 本文由 梦回阑珊 原创首发于 CSDN转载注明出处 代码改变世界,你来改变代码✨