当前位置: 首页 > 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…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...