线程池 QThreadPool

【Qt】Qt多线程开发 —【QThreadPool 】线程池 Qt多线程 — QThreadPool 文章目录Qt多线程 — QThreadPool一、简介二、使用方法三、QThreadPool的成员函数(3-1)设置自动删除标志【setAutoDelete】(3-2)设置线程超时时间【setExpiryTimeout】(3-3)设置线程池的最大线程数【setMaxThreadCount】(3-4)预留线程【reserveThread】(3-5)释放线程【releaseThrad】(3-6)开始线程【start】(3-7)设置堆栈大小【setStackSize】(3- 阅读详情

http://qtdebug.com/qtbook-thread-pool/

创建线程需要向系统申请资源,线程切换时操作系统会切换线程上下文,可能会从用户态切换到内核态,当有很多线程时,频繁地切换线程会导致消耗大量的 CPU 以及内核资源,真正用于计算的资源就减少了,反而会降低程序的效率。线程并不是越多越好,线程池的作用是管理、复用、回收一组线程,控制线程的数量,避免频繁的创建和销毁线程而浪费资源。

Qt 中的线程池类为 QThreadPool,每一个 Qt 程序都有一个全局的线程池,调用 QThreadPool::globalInstance() 得到,它默认最多创建 8 个线程,如果想改变最大线程数则调用 setMaxThreadCount() 进行修改,调用 activeThreadCount() 查看线程池中当前活跃的线程数。

使用线程池挺简单的,定一个任务类例如叫 Task,继承 QRunnable 并实现虚函数 run(),Task 的对象作为 QThreadPool::start() 的参数就可以了,线程池会自动的在线程中调用 Task 的 run() 函数,异步执行。线程池中的 QRunnable 对象太多时并不会为立即为每一个 QRunnable 对象创建一个线程,而是让它们排队执行,同时最多有 maxThreadCount() 个线程并行执行。

提交给线程池的 QRunnable 对象在它的 run() 函数执行完后会被自动 delete 掉,如果不想线程池删除它,在调用线程池的 start() 前调用 setAutoDelete(false) 即可。

为了演示线程池的使用,下面定义一个任务类 Task,属性 id 为了便于了解任务对象的创建、执行、销毁,run() 模拟耗时操作,随机执行 [500, 2500] 毫秒,然后在 main() 函数中创建 100 个 Task 对象提交给线程池,从输出中可以看到同时只有 8 个任务在执行,run() 执行结束后任务对象被 delete 掉了。


     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

     
// 文件名: Task.h
#ifndef TASK_H
#define TASK_H
#include <QRunnable>
class Task : public QRunnable {
public:
Task( int id);
~Task();
void run() Q_DECL_OVERRIDE;
private:
int id; // 线程的 ID
};
#endif // TASK_H

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

     
// 文件名: Task.cpp
#include "Task.h"
#include <QDebug>
#include <QThread>
#include <QDateTime>
Task::Task( int id) : id(id) {
}
Task::~Task() {
qDebug().noquote() << QString( "~Task() with ID %1").arg(id); // 方便查看对象是否被 delete
}
void Task::run() {
qDebug().noquote() << QString( "Start thread %1 at %2").arg(id).arg(QDateTime::currentDateTime().toString( "mm:ss.z"));
QThread::msleep( 500 + qrand() % 2000); // 每个 run() 函数随机执行 [55, 2500] 毫秒,模拟耗时任务
qDebug().noquote() << QString( "End thread %1 at %2").arg(id).arg(QDateTime::currentDateTime().toString( "mm:ss.z"));
}

     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

     
// 文件名: main.cpp
#include <QApplication>
#include <QThreadPool>
#include "Task.h"
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
for ( int i = 1; i <= 100; ++i) {
Task *task = new Task(i); // 创建任务
QThreadPool::globalInstance()->start(task); // 提交任务给线程池,在线程池中执行
}
return a.exec();
}

控制台输出如下:


     
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

     
Start thread 1 at 27:05.541
Start thread 6 at 27:05.541
Start thread 5 at 27:05.541
Start thread 2 at 27:05.541
Start thread 3 at 27:05.541
Start thread 8 at 27:05.541
Start thread 7 at 27:05.541
Start thread 4 at 27:05.541
End thread 6 at 27:06.854
~Task() with ID 6
End thread 1 at 27:06.854
~Task() with ID 1
End thread 8 at 27:06.854
~Task() with ID 8
End thread 3 at 27:06.854
~Task() with ID 3
End thread 7 at 27:06.854
End thread 4 at 27:06.854
End thread 2 at 27:06.854
~Task() with ID 7
End thread 5 at 27:06.854
~Task() with ID 4
~Task() with ID 2
~Task() with ID 5
Start thread 9 at 27:06.855
Start thread 10 at 27:06.855
Start thread 11 at 27:06.855
Start thread 12 at 27:06.855
Start thread 13 at 27:06.855

继承 QThread 和使用 QThreadPool 都能进行多线程编程,那么什么时候使用线程池,什么时候继承 QThread 创建线程呢?

频繁创建、耗时短的任务使用线程池来执行更合适,例如通过串口不停地接收到数据,然后交给线程池进行计算处理,如果每接收到一次数据都创建一个新线程就太浪费资源了。耗时长的任务就一般会继承 QThread 使用多线程,例如使用 QProcess 启动一个命令行,和命令行进行交互时就可以这么做。


Qt中的线程池QThreadPool 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永... 阅读详情

相关推荐

QT线程池的使用:QThreadPool类和QRunnable类

目录QThreadPool类 主要属性 主要成员函数 QRunnable类 主要成员函数 程序实例 QThreadPool类用来管理 QThreads。此类中的所有函数都是线程安全的.主要属性:1、activeThreadCount: 此属性表示线程池中的活动线程数,通过activeThreadCount() 调用。 2、expiryTimeout: 线程活着的时间。没有设置expiryTim

未来之歌 3万+

Qt程序中最多可以启动的线程数量

参考 一个进程(process)最多可以开辟多少个线程(thread) Qt 事件系统浅析 (用 Windows API 描述) Qt源码分析之事件分发器QEventDispatcherWin32

beibeix2015的博客 3640

QT异步编程之线程池QThreadPool

1、QThreadPool是Qt中用于管理线程池的类,适合处理大量短期的任务2、通过QRunnable定义任务逻辑,并使用QThreadPool提交任务3、可以设置线程池大小、等待任务完成,并管理任务的生命周期。

weixin_51795597的博客 1320

Qt多线程-QThread

QThread多线程实现投掷骰子功能

weixin_41918998的博客 1111

Qt 中的线程池QRunnable和QThreadPool

QRunnable是 Qt 框架中用于表示可运行任务的类,它是线程池()中任务的接口。通过继承QRunnable并重写其run()方法,可以创建一个可以在单独线程中执行的任务。QRunnable是 Qt 实现线程池任务调度的核心机制之一。1. QRunnable 的作用QRunnable是一个抽象类,用于表示一个可以被线程执行的任务。它的主要目的是将任务封装为一个对象,然后通过线程池()或其他线程管理机制来执行这些任务。QRunnable的设计使得任务的创建和执行解耦,从而提高了代码的可维护性和可扩展性。

weixin_45144862的博客 1355

QThreadPool线程池作用、原理和使用

该函数就是尝试调用obj的member函数,可以是信号、槽或者Q_INVOKABLE声明的函数(能够被Qt元对象系统唤起),如果调用成功,返回true,失败返回false,具体使用方法就不在这里介绍。//函数定义QMetaObject::invokeMethod可以是异步调用,也可以是同步调用。这取决与它的连接方式Qt::ConnectionType type。如果type为Qt::DirectConnection,则为同步调用,若为Qt::QueuedConnection,则为异步调用。

qq_46117468的博客 3507

Qt线程池QThreadPool使用示例

线程池顾名思义就是同时管理多个线程的"池子",它是一种并发处理技术,在程序中使用线程池能够提高线程的使用效率,提高程序的稳定性。本文从线程池的实现原理开始,介绍了QT框架里的线程池QThreadPool,并提供一个使用示例。线程池的实现思路大致是这样的,在程序启动时创建一定数量的线程交给线程池管理,它通过一个任务队列来给各个线程分配任务。当需要使用线程处理一些任务时,就把这些任务扔给线程池,让线程池决定这些任务由哪个线程执行。

北极星的技术笔记 6566

QT线程池实验研究与分析(QThread与和QThreadPool + QRunnable使用上的区别)

第一部分:QT线程池的构建与使用 网上关于QT线程池QThreadPool的文章很多,而且大都千篇一律,基本上都是参考QT的帮助文档介绍QT全局线程池的用法。这样就往往会使人产生误解,QT是不是推荐大家使用其全局线程池,而不推荐使用自定义构造的线程池? 实际情况并不是这样的。而且在实际的项目当中我们通常并不希望仅仅使用一个全局的线程池,而是在需要线程池的工程中都构建和维护自己一个小小的线

墙角里的光线 1万+

QThreadPool线程池的原理与使用

一、为什么需要用线程池 现在所有的高性能服务器程序,几乎都会使用到线程池技术,从而更好且有效的榨干服务器性能。 1、开多少个线程可以达到性能最佳 不知道,你有没有这个疑问? 这是一种常见的线程使用方式: class MyThread: public QThread { public: virtual void run() override { // ... } }; MyThread th; th.start(); 线程的创建和销毁是有性能开销的,当我们有少量业务需

百里杨的博客 7440

Qt基础篇:Qt线程池QThreadPool的使用

QT 多线程之线程池QThreadPool可以用来管理线程的优先顺序,防止创建过多的线程,起到很好的管理作用。

欧特GO 2831

QT 多线程之线程池QThreadPool(深入理解)

QT多线程专栏共有14篇文章,从初识线程到、QMutex锁、QSemaphore信号量、Emit、Sgnals、Slot主线程子线程互相传值同步变量、QWaitCondition、事件循环、QObjects、线程安全、线程同步、线程异步、QThreadPool线程池等线程操作进行了全面!深入!的研究和详细的说明

断点 3万+

Qt线程池QThreadPool如何使用

Qt线程池QThreadPool如何使用

m0_60259116的博客 1229

【机械臂算法】基于最小惯性参数集的动力学辨识仿真实践

本文深入探讨了机械臂动力学参数辨识的核心挑战与解决方案,重点阐述了基于最小惯性参数集的理论与方法。通过分析PUMA560实例,详细介绍了利用QR分解法或符号推导法获取可辨识参数集,并系统讲解了从激励轨迹设计、仿真数据采集、线性系统求解到模型验证的完整实践流程,为高精度动力学建模与控制奠定了坚实基础。

weixin_29054399的博客 376

QT 多线程 线程池 QRunnalbe QThreadPool

一、背景 QT中线程很早就出现了,多线程的使用目的是为了减轻主线程压力,不至于主线程界面卡顿,提高用户体验。但是线程的创建与销毁需要与系统交互,会产生很大的开销。若需要频繁的创建线程就建议使用线程池,有线程池维护一定数量的线程,当需要进行多线程的运算时,将运算函数传递给线程池即可。线程池会根据可用线程进行任务安排。 线程池有什么作用呢? 一个作用就是限制系统中执行线程的数量。...

漫步繁华街的专栏 1万+

数字IC设计(8)之AHB-Lite总线(持续更新)

AHB总线全称Advanced High-performance Bus,意为先进高性能总线。推出该总线的目的是补充APB总线在性能上的不足,APB总线适合挂载低速外设,所以AHB总线用来挂载高性能的外设,这样子可以分工合作,节约资源。AHB总线可以实现多主多从的连接,此时需要设计仲裁机和matrix(矩阵),AHB-Lite一般用于一主多从,此时则不需要仲裁机和matrix,但是也可以用AHB-Lite来实现多主多从,就是设计多个layer,每个layer是一主多从,再把各个layer连起来;

qq_69440734的博客 2256

手把手教你用TiggerRamDisk绕过iPhone/iPad激活锁(支持iOS16.3,Win/Mac双平台保姆级教程)

本文详细介绍了如何使用TiggerRamDisk工具绕过iPhone/iPad的激活锁,支持iOS16.3系统,并提供Windows和Mac双平台的保姆级教程。从工具准备、设备连接到核心解锁流程,一步步指导用户完成操作,帮助二手设备或旧设备重获新生。

weixin_29323493的博客 916

Qt中的线程池QThreadPool的理解

Qt中的线程池QThreadPool 我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),

周杰伦 1982

新手也能懂的Simulink汽车二自由度建模:从公式推导到模型搭建全流程

本文为新手提供了在Simulink中搭建汽车二自由度模型的完整实战指南。文章从模型核心概念讲起,详细讲解了如何将车辆动力学方程转化为状态空间模型,并逐步指导在Simulink中实现从参数设置、模块搭建到仿真验证的全过程。通过阶跃转向测试和参数影响分析,帮助读者直观理解车辆转向特性,并提供了实用的模型扩展思路与常见问题排查技巧。

weixin_29047919的博客 215

Qt 线程池 QThreadPool

然后在主线程中,我们获取了QThreadPool的全局实例,设置了线程池的最大线程数量,并创建了Worker的实例,最后将其提交到线程池中执行。总的来说,QThreadPool提供了一种方便的方式来管理和调度多个线程的执行,通过它可以有效地提高应用程序的性能和响应速度。在使用线程池时,应当注意合理设置最大线程数以及正确处理任务的提交和执行结果。,通过使用线程池可以提高性能、控制并发度、提供任务队列和简化线程管理。一.Qt 线程池 QThreadPool介绍。二.Qt线程池的一个简单使用示例。

liushiyi3083862599的博客 1430

RexUniNLU零样本通用自然语言理解:nlp_deberta_rex-uninlu_chinese-base模型实战解析

本文深入解析了RexUniNLU零样本通用自然语言理解模型(nlp_deberta_rex-uninlu_chinese-base)的实战应用。通过详细的环境配置、模型加载及实战案例,展示了该模型在零样本场景下的强大能力,如实体识别和复杂关系抽取,显著提升NLP任务效率。

weixin_29088655的博客 251

绿盾用户使用看图软件每次都需要把图片解密之后才能打开查看,怎么才能不用这么麻烦打开就能看

Win10专业版绿盾控制台7.0看图软件FastStone Image Viewer。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 1202
上一篇: QSS QCalendarWidget
下一篇: QCombobox设置下拉框的宽度(设置QComboBox的下拉框Item高度|下拉框下拉列表的高度)
cocoasprite
博客等级 码龄14年 72粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值