当前位置: 首页 > news >正文

QT(12)-QThreadPool

1 简介

QThreadPool是Qt框架中的一个类,提供了一组工作线程池。该线程池自动管理一组工作线程,在线程可用时分配任务。使用线程池的主要优点是,它可以减少创建和销毁线程的开销,因为可以重复使用线程。

线程池设计用于场景中,你有大量短暂任务需要并发运行。例如,如果您有一个需要执行大量I/O绑定或CPU绑定任务的GUI应用程序,可以使用线程池在后台运行这些任务,而不会阻塞GUI线程。

要使用QThreadPool,您需要创建一个从QRunnable派生的任务类,并实现run()方法。然后,您创建任务类的实例,并使用start()方法将其添加到线程池中。线程池将自动将任务分配给其中一个工作线程,并在后台运行任务。

除了基本的线程池功能外,QThreadPool还提供了优先级任务和设置最大并发线程数的支持。这在您需要确保在其他任务之前执行某些任务或限制并发线程数以避免超载系统

2 函数

静态公有函数
QThreadPool * globalInstance()

globalInstance() 是 QThreadPool 的静态函数,它返回一个指向全局 QThreadPool 单例对象的指针。全局 QThreadPool 对象是整个程序共享的,不需要手动创建。通过调用 globalInstance() 函数,可以在程序中访问到这个全局的 QThreadPool 对象,并通过它管理线程。

int activeThreadCount() const
获取线程池中当前活动的线程数。

void clear()
移除线程池中的所有任务,并删除已经设置了 runnable->autoDelete() 属性为 true 的任务,并销毁已经启动但尚未完成的线程。

bool contains(const QThread *thread) const
它用于检查线程池是否包含给定的线程。如果包含,则返回 true,否则返回 false。这个函数可以用于动态管理线程池中的线程,以确保线程池的效率和效果。

int expiryTimeout() const
void setExpiryTimeout(int expiryTimeout)
用于设置线程池中线程的超时时间。线程池会检查未使用的线程,并在它们在指定时间内未使用的情况下将它们视为已过期,并将其终止。这可以防止线程长时间占用线程池中的资源,并可以提高线程池的效率。

默认情况下,新创建的线程的超时时间为30000毫秒(30秒)。如果超时时间为负数,则新创建的线程不会过期,也就是说,它们不会在线程池被销毁之前退出。

请注意,在已经运行的线程上设置超时时间不会产生任何影响。仅新创建的线程会使用新的超时时间。因此,建议在创建线程池后立即设置超时时间,但在调用 start 函数之前。

int maxThreadCount() const
void setMaxThreadCount(int maxThreadCount)
此属性表示线程池使用的最大线程数。
注意:线程池将始终使用至少 1 个线程,即使maxThreadCount限制为零或负数。

void releaseThread()
它释放由之前调用 reserveThread 函数预留的线程。
在某些情况下,线程可能需要等待更多工作,此时调用 releaseThread 函数可以让该线程临时释放,从而允许其他线程继续执行。但是,当线程再次获得任务并继续处理时,应该再次调用 reserveThread 函数,以确保线程池能够正确维护 activeThreadCount。

void reserveThread()
reserveThread 函数是 QThreadPool 类中的一个函数,它用于预留一个线程。这个函数不会考虑当前的活动线程数量和最大线程数量,因此可以保证您可以预留一个线程。

在完成使用线程后,请调用 releaseThread 函数,以便将其重新用于其他任务。

请注意,使用此函数将永远增加活动线程的数量。这意味着通过使用此函数,activeThreadCount 函数可能返回一个大于 maxThreadCount 的值。

void setStackSize(uint stackSize)
uint stackSize() const
线程栈大小是指线程在执行任务时使用的内存空间的大小。

该函数的参数是栈的大小,以字节为单位。如果未指定栈的大小,则使用默认值。默认栈大小对于大多数程序应该足够,但是,如果您的程序需要更大的栈,则可以使用此函数调整栈大小。

void start(QRunnable *runnable, int priority = 0)
void start(std::function<void ()> functionToRun, int priority = 0)
void start(QRunnable *runnable, int priority = 0):该版本接收一个 QRunnable 对象作为参数。您可以将任务封装在 QRunnable 对象中,然后将该对象传递给 start 函数,以在线程池中运行该任务。参数 priority 表示任务的优先级,默认值为0,表示普通优先级。

void start(std::function<void ()> functionToRun, int priority = 0):该版本接收一个 std::function 对象作为参数。您可以将任务封装在该对象中,然后将该对象传递给 start 函数,以在线程池中运行该任务。参数 priority 表示任务的优先级,默认值为0,表示普通优先级。

// Using QRunnable
class MyTask : public QRunnable
{void run(){// Code to run in a thread}
};QThreadPool::globalInstance()->start(new MyTask());// Using std::function
QThreadPool::globalInstance()->start([]()
{// Code to run in a thread
});

bool tryStart(QRunnable *runnable)
如果在调用时没有可用的线程,那么这个函数不做任何操作并返回 false。否则,runnable 将立即使用一个可用的线程运行,此函数将返回 true。

请注意,如果 runnable->autoDelete() 返回 true,则线程池将拥有 runnable 的所有权,并且线程池在 runnable->run() 返回后将自动删除 runnable。如果 runnable->autoDelete() 返回 false,则 runnable 的所有权仍然归调用者所有。请注意,在调用此函数后更改 runnable 的自动删除将导致未定义的行为。
bool tryStart(std::function<void ()> functionToRun)
尝试保留一个线程来运行 functionToRun。

如果在调用时没有可用的线程,那么这个函数不做任何操作并返回 false。否则,functionToRun 将立即使用一个可用的线程运行,此函数将返回 true。

bool tryTake(QRunnable *runnable)
函数尝试从队列中删除指定的未启动的 Runnable。如果 Runnable 尚未启动,则返回 true,并且 Runnable 的所有权转移到调用者(即使 runnable->autoDelete() 返回 true)。否则返回 false。

注意:如果 runnable->autoDelete() 返回 true,则可能删除错误的 Runnable。这是 ABA 问题:原始的 Runnable 可能已经执行过并且已经被删除。内存被另一个 Runnable 重用,然后被删除。因此,我们建议仅在 Runnable 没有自动删除时调用此函数。

bool waitForDone(int msecs = -1)
函数等待所有线程退出,并删除线程池中的所有线程,最多等待 msecs 毫秒。如果所有线程都已删除,则返回 true;否则返回 false。如果 msecs 为 -1(默认值),则忽略超时(等待最后一个线程退出)。

相关文章:

QT(12)-QThreadPool

1 简介 QThreadPool是Qt框架中的一个类&#xff0c;提供了一组工作线程池。该线程池自动管理一组工作线程&#xff0c;在线程可用时分配任务。使用线程池的主要优点是&#xff0c;它可以减少创建和销毁线程的开销&#xff0c;因为可以重复使用线程。 线程池设计用于场景中&am…...

【Java|golang】1138. 字母板上的路径

我们从一块字母板上的位置 (0, 0) 出发&#xff0c;该坐标对应的字符为 board[0][0]。 在本题里&#xff0c;字母板为board [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”]&#xff0c;如下所示。 我们可以按下面的指令规则行动&#xff1a; 如果方格存…...

Flink 1.14从简单到源码第三讲

文章目录 1.flink多流操作Api1.1split 分流操作1.2.侧输出流1.3.connect 连接操作1.4.union 操作1.5 coGroup 协同分组1.6 join1.7 broadcast 广播2.process3.并行度和Api3.1 任务提交简单流程3.2 task与算子链4. Flink 时间相关(窗口计算)4.1时间语义(窗口计算)4.2 新版api指定…...

淘宝API接口系列,获取购买到的商品订单列表,卖出的商品订单列表,订单详情,订单物流,买家信息,收货地址列表,买家token

custom自定义API操作buyer_order_list获取购买到的商品订单列表buyer_order_detail获取购买到的商品订单详情buyer_order_express获取购买到的商品订单物流buyer_address_list收货地址列表buyer_address_add添加收货地址buyer_info买家信息buyer_token买家tokenseller_order_li…...

ucos-ii 的任务调度原理和实现

ucosii 任务调度和原理1、ucos-ii 任务创建与任务调度 1.1、任务的创建 当你调用 OSTaskCreate( ) 进行任务的创建的时候&#xff0c;会初始化任务的堆栈、保存cpu的寄存器、创建任务的控制块&#xff08;OS_TCB&#xff09;等的操作&#xff1b; if (OSTCBPrioTbl[prio] (OS_…...

Solon2 开发之容器,七、切面与函数环绕拦截

想要环绕拦截一个 Bean 的函数。需要三个前置条件&#xff1a; 通过注解做为“切点”&#xff0c;进行拦截&#xff08;不能无缘无故给拦了吧&#xff1f;费性能&#xff09;Bean 的 method 是被代理的在 Bean 被扫描之前&#xff0c;完成环绕拦截的注册 1、定义切点和注册环…...

代码随想录第十天(28)

文章目录28. 找出字符串中第一个匹配项的下标看答案KMPnext数组&#xff08;前缀表&#xff09;最长公共前后缀如何计算前缀表前缀表与next数组时间复杂度分析28. 找出字符串中第一个匹配项的下标 莫得思路……好久没做题&#xff0c;都已经忘得差不多了 看答案 其实就是自己…...

循环队列来了解一下!!

笔者在之前的一篇文章&#xff0c;详细的介绍了&#xff1a;队列之单向链表与双向链表的模拟实现&#xff1a;https://blog.csdn.net/weixin_64308540/article/details/128742090?spm1001.2014.3001.5502 感兴趣的各位老铁&#xff0c;可以参考一下啦&#xff01;下面进入循环…...

Idea打包springboot项目war包,测试通过

pom.xml文件 <!--包名以及版本号&#xff0c;这个是打包时候使用&#xff0c;版本可写可不写&#xff0c;建议写有利于维护系统--> <artifactId>tsgdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <!--打包形式--> <packaging&…...

python+django高校师生健康信息管理系统pycharm

管理员功能模块 4.1登录页面 管理员登录&#xff0c;通过填写注册时输入的用户名、密码、角色进行登录&#xff0c;如图所示。 4.2系统首页 管理员登录进入师生健康信息管理系统可以查看个人中心、学生管理、教师管理、数据收集管理、问卷分类管理、疫情问卷管理、问卷调查管理…...

CUDA中的流序内存分配

文章目录CUDA中的流序内存分配1. Introduction2. Query for Support3. API Fundamentals (cudaMallocAsync and cudaFreeAsync)4. Memory Pools and the cudaMemPool_t注意&#xff1a;设备的内存池当前将是该设备的本地。因此&#xff0c;在不指定内存池的情况下进行分配将始终…...

开源、低成本的 Xilinx FPGA 下载器(高速30MHz)

目前主流的Xilinx下载器主要有两种&#xff1a;一种是Xilinx官方出品的Xilinx Platfom Cable USB&#xff0c;还有一个就是Xilinx的合作伙伴Digilent开发的JTAG-HS3 Programming Cable。 JTAG-HS系列最大支持30MHz下载速度&#xff0c;基于FTDI的FT2232方案。 JTAG-HS系列对比…...

Maven专题总结

1. 什么是Maven Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a; Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和…...

谷粒商城--SPU和SKU

目录 1.SPU和SKU概念 2.表的关系理解 3.导入前端代码 4.完善后端接口 5.属性分组详情 6.规格参数详情 7. 销售属性详情 8.分组与属性关联 9.发布商品 10.仓库服务 1.SPU和SKU概念 SPU&#xff1a;standard product unit(标准化产品单元)&#xff1a;是商品信息聚合的…...

二叉树OJ题(上)

✅每日一练&#xff1a;100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; 题目的意思是俩棵树的结构不仅要相同&#xff0c;而且每个节点的值还要相同&#xff0c;如果满足上面2个条件&#xff0c;则成立&#xff01; 解题思路&#xff1a; 从三个方面去考虑&#xff1…...

第一章 PDF语法

第一章 PDF语法PDF ObjectsNull ObjectsBoolean ObjectsNumeric ObjectsName ObjectsString ObjectsArray ObjectsDictionary ObjectsName treesNumber treesStream ObjectsDirect versus Indirect ObjectsFile StructureWhite-SpaceThe Four Sections of a PDFHeaderTrailerBo…...

IntelliJ IDEA 创建JavaFX项目运行

IntelliJ IDEA 创建JavaFX项目运行JavaFX官网文档&#xff1a;https://openjfx.io/openjfx-docs/ JavaFX 2008年12月05日诞生&#xff0c;是一个开源的下一代客户端应用程序平台&#xff0c;适用于基于 Java 构建的桌面、移动和嵌入式系统。这是许多个人和公司的协作努力&#…...

IC封装常见形式

参考&#xff1a;https://blog.csdn.net/dhs888888/article/details/127673300?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-127673300-blog-115610343.pc_relevant_multi_platform_whitelistv4&spm1001.2101.3001.4242…...

Linux通配符、转义符讲解

目录 通配符 通过通配符定义匹配条件 转义符 将所有的逻辑操作符都转换成字符 通配符 通过通配符定义匹配条件 * 任意字符都可以通配&#xff08;也可以匹配空值&#xff09; &#xff1f; 匹配单个字符 [a-z] 匹配单个的小写英文字母 [A-Z] 匹配单个的大写英文…...

[OpenMMLab]提交pr时所需的git操作

git开发流程 准备工作 作为一个开发者&#xff0c;fork一个仓库之后应该先做什么&#xff1f; 1、下载仓库&#xff0c;创建上游代码库&#xff0c;查看当前的分支情况 git clone https://github.com/<your_name>/<repo_name>.git git remote add upstream git…...

pandas——groupby操作

Pandas——groupby操作 文章目录Pandas——groupby操作一、实验目的二、实验原理三、实验环境四、实验内容五、实验步骤一、实验目的 熟练掌握pandas中的groupby操作 二、实验原理 groupby(byNone, axis0, levelNone, as_indexTrue, sortTrue, group_keysTrue, squeezeFalse&…...

webpack.config.js哪里找?react项目关闭eslint监测

目录 webpack.config.js哪里找&#xff1f; react项目关闭eslint监测 webpack.config.js哪里找&#xff1f; 在React项目中&#xff0c;当我们需要修改一些配置时&#xff0c;发现找不到webpack.config.js&#xff0c;是我们创建的项目有问题吗&#xff0c;还需新创建项目的项…...

OpenCV 图像梯度算子

本文是OpenCV图像视觉入门之路的第12篇文章&#xff0c;本文详细的介绍了图像梯度算子的各种操作&#xff0c;例如&#xff1a;Sobel算子Scharr算子laplacian算子等操作。 OpenCV 图像梯度算子目录 1 Sobel算子 2 Scharr算子 3 laplacian算子 1 Sobel算子 Sobel算子是一种图…...

Linux c编程之Wireshark

Wireshark是一个网络报文分析软件,是网络应用问题分析必不可少的工具软件。网络管理员可以使用wireshark排查网络问题。程序开发人员可以用来分析应用协议、定位分析应用问题。无论是网络应用程序开发人员、测试人员、部署人员、技术支持人员,掌握wireshark的使用对于分析网络…...

极客时间_FlinkSQL 实战

一、批处理以及流处理技术发展 1.Lambda架构三层划分Batch Layer、Speed Layer和Serving Layer。 ①、Batch Layer:主要用于实现对历史数据计算结果的保存,每天计算的结果都保存成为一个Batch View,然后通过对Batch View的计算,实现历史数据的计算。 ②、Speed Layer正是用…...

Pytorch 混合精度训练 (Automatically Mixed Precision, AMP)

Contents混合精度训练 (Mixed Precision Training)单精度浮点数 (FP32) 和半精度浮点数 (FP16)为什么要用 FP16为什么只用 FP16 会有问题解决方案损失缩放 (Loss Scaling)FP32 权重备份黑名单Tensor CoreNVIDIA apex 库代码解读opt-level (o1, o2, o3, o4)apex 的 o1 实现apex …...

使用太极taichi写一个只有一个三角形的有限元

公式来源 https://blog.csdn.net/weixin_43940314/article/details/128935230 GAME103 https://games-cn.org/games103-slides/ 初始化我们的三角形 全局的坐标范围为0-1 我们的三角形如图所示 ti.kernel def init():X[0] [0.5, 0.5]X[1] [0.5, 0.6]X[2] [0.6, 0.5]x[0…...

进程,线程

进程是操作系统分配资源的基本单位&#xff0c;线程是CPU调度的基本单位。 PCB&#xff1a;进程控制块&#xff0c;操作系统描述程序的运行状态&#xff0c;通过结构体task,struct{…}&#xff0c;统称为PCB&#xff08;process control block&#xff09;。是进程管理和控制的…...

第03章_基本的SELECT语句

第03章_基本的SELECT语句 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 1. SQL概述 1.1 SQL背景知识 1946 年&#xff0c;世界上第一台电脑诞生&#xff0c;如今&#xff0c;借由这台电脑发展…...

干货 | 简单了解运算放大器...

运算放大器发明至今已有数十年的历史&#xff0c;从最早的真空管演变为如今的集成电路&#xff0c;它在不同的电子产品中一直发挥着举足轻重的作用。而现如今信息家电、手机、PDA、网络等新兴应用的兴起更是将运算放大器推向了一个新的高度。01 运算放大器简述运算放大器&#…...

关掉自己做的网站/运营培训

文本编辑器有很多&#xff0c;图形模式下有gedit、kwrite等编辑器&#xff0c;文本模式下的编辑器有vi、vim&#xff08;vi的增强版本&#xff09;和nano。vi和vim是Linux系统中最常用的编辑器。有人曾这样的说过在世界上有三种人&#xff1a;一种是使用Vi的&#xff0c;另一种…...

怎样做网站变手机软件/韩国vs加纳分析比分

JSON的定义&#xff1a; 一种轻量级的数据交换格式&#xff0c;具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式 &#xff0c;获得了当今大部分语言的支持&#xff09;&#xff0c;从而可以在不同平台间进行数据交…...

网络销售应该注册什么公司/电商seo是指

// func3-2.cpp algo3-6.cpp和algo3-7.cpp要调用的函数 char Precede(SElemType t1,SElemType t2) { // 根据教科书表3.1&#xff0c;判断t1&#xff0c;t2两符号的优先关系(#用\n代替)char f;switch(t2){case :case -:if(t1(||t1\n)f<; // t1<t2elsef>; // t1>t2b…...

宝塔wordpress更换域名/上海比较好的seo公司

来源&#xff5c;雷锋网作者&#xff5c;李帅飞市场终是无情&#xff0c;时间更是无情。三星不想缺席中国智能手机市场——哪怕手机业务在中国市场的存在感接近于无&#xff0c;但这是世界第一大智能手机市场&#xff0c;三星并不言弃。毕竟&#xff0c;就算三星手机卖不出去&a…...

建网站的流程/微信软文广告经典案例

function dbc2sbc(obj){ var str obj.value; var result""; for(var i0;i<str.length;i) { code str.charCodeAt(i);//获取当前字符的unicode编码 if (code > 65281 && code < 65373)//在这个unicode编码范围中的是所有的英文字母已经各种字符 { …...

佛山网站建设app/一年的百度指数

在家自制手工曲奇&#xff0c;因为在制作过程中没有添加防腐剂和添加剂&#xff0c;所以保质期多半为15-30天&#xff0c;而且必须是密封好保存在阴凉干燥处&#xff0c;否则时间会缩短。为了保证手工曲奇的口感&#xff0c;曲奇应尽量在短时间内吃完&#xff0c;那如果做的太多…...