QtApplets-线程池

头图

QtApplets-线程池

​ 今天咱们稍微看下Qt的线程池。QThreadPool,浅浅搞一下。


文章目录

  • QtApplets-线程池
    • QThreadPool
    • QThreadPool 与 QThread 区别
    • 替代方案
      • Qt Concurrent
    • QThreadPool 与 Qt Concurrent 区别
    • Demo
      • 运行效果
    • ☞ 源码

关键字: QtQRunnableQThreadPool线程池Demo

QThreadPool

QThreadPool 是 Qt 框架中的一个类,用于管理和调度多线程任务的线程池。它提供了一种方便的方式来执行和管理 QRunnableQThread 对象,并控制并发执行的线程数量。
以下是关于 QThreadPool 的一些主要功能:

  • 全局线程池实例:Qt 提供了一个全局共享的线程池实例,可以通过 QThreadPool::globalInstance() 获取。
  • 添加任务:可以使用 QThreadPool 的 start() 函数来添加任务。任务可以是继承自 QRunnable 的对象或继承自 QThread 的对象。
  • 控制线程数量:可以使用 setMaxThreadCount() 函数设置线程池的最大线程数量。线程池将根据需要动态创建或销毁线程,以使线程数量保持在指定范围内。
  • 队列管理:线程池使用一个任务队列来管理待执行的任务。当线程池中的线程完成任务时,它们将从队列中获取下一个任务并执行。
  • 任务取消:可以使用 cancel() 函数来取消正在执行的任务。被取消的任务将不会被执行完毕。
    QThreadPool 适用于并发执行大量相对简单的任务,例如计算密集型任务、网络请求等。如果您需要更高级的线程管理和结果处理,可以考虑使用 Qt 的其他多线程类和机制,如 QThread、QtConcurrent 等。总的来说,QThreadPool 是 Qt 框架中用于管理和调度多线程任务的线程池类。通过添加任务对象到线程池并控制线程数量,可以实现任务的并发执行和系统资源的高效利用。这样可以更好地利用系统资源,并实现任务的并行处理和异步操作。

QThreadPool 与 QThread 区别

QThreadQThreadPool 都是 Qt 框架中用于多线程编程的类,但它们的使用场景和方式有所不同。

QThread:

  • QThread 是一个线程类,可以创建和管理一个线程。
  • 你需要自己管理 QThread 的生命周期,包括创建、启动和销毁线程。
  • 你可以通过继承 QThread 并重写其 run() 方法来定义线程的任务。
  • QThread 更适合长期运行的任务或者需要详细控制的任务。

QThreadPool:

  • QThreadPool 是一个线程池类,可以管理和复用多个线程。
  • QThreadPool 会自动管理线程的生命周期,包括创建、启动和销毁线程。
  • 你可以通过创建 QRunnable 对象并将其添加到 QThreadPool 来定义线程的任务。
  • QThreadPool 更适合执行大量短期的任务,因为它可以复用线程,避免了频繁创建和销毁线程的开销。

总的来说,QThread 和 QThreadPool 的主要区别在于它们的管理方式和使用场景。你可以根据你的具体需求来选择使用哪一个。

替代方案

在 Qt 中,除了 QThread 和 QThreadPool,还有其他一些多线程编程的替代方案:

  • Qt Concurrent:Qt Concurrent 提供了一种将任务分发到处理器所有的核的易用接口。线程代码完全被隐藏在 Qt Concurrent 框架下,所以你不必考虑细节。尽管如此,Qt Concurrent 不能用于线程运行时需要通信的情况,而且它也不应该被用来处理阻塞操作。
  • WorkerScript:WorkerScript 是 QML 中的线程化。如果你正在使用 QML 进行开发,那么 WorkerScript 可能是一个很好的选择。
  • 其他库:除了 Qt,还有一些其他的 C++ 库也提供了多线程支持,例如 Boost.Asio、Poco、ACE 等5。这些库的功能和 Qt 类似,但可能在某些特定的使用场景下更加适合。

Qt Concurrent

[参考链接](Qt并发模块Qt Concurrent的使用_qtconcurrent 用法-CSDN博客)

QtConcurrent 命名空间提供了高级 api,使得无需使用诸如互斥、读写锁、等待条件或信号量等低级线程原语就可以编写多线程程序。使用 QtConcurrent 编写的程序会根据可用的线程处理器核心数量自动调整使用的线程数,这意味着编写的应用程序在部署到多核系统时将自动扩展。
当你发现你自己的程序UI运行不流畅时可以尝试将执行计算的函数放到QtConcurrent::run()中处理,这比改用QThread方便得多。

QThreadPool 与 Qt Concurrent 区别

QThreadPoolQt Concurrent 都是 Qt 框架中用于多线程编程的工具,但它们的使用方式和适用场景有所不同。

QThreadPool:

  • QThreadPool 是一个线程池类,它可以管理和复用多个线程。
  • 你可以通过创建 QRunnable 对象并将其添加到 QThreadPool 来定义线程的任务。
  • QThreadPool 更适合执行大量短期的任务,因为它可以复用线程,避免了频繁创建和销毁线程的开销。

Qt Concurrent:

  • Qt Concurrent 是一个命名空间,它提供了一些高级 API,使得无需使用诸如互斥、读写锁、等待条件或信号量等低级线程原语就可以编写多线程程序。
  • 使用 Qt Concurrent 编写的程序会根据可用的线程处理器核心数量自动调整使用的线程数,这意味着编写的应用程序在部署到多核系统时将自动扩展。
  • Qt Concurrent 提供了一些静态函数,可以运行自定义函数,也提供了对容器的操作函数。

Demo

首先,我们定义一个任务类,它继承自QRunnable

class Task : public QRunnable
{
protected:void run() override{// 这里放置任务代码qDebug() << "Task executed in thread" << QThread::currentThread();// 模拟一些工作QThread::sleep(1);}
};

然后,在某个类中,我们使用QThreadPool来管理和执行这些任务:

    // 获取全局线程池的实例QThreadPool *pool = QThreadPool::globalInstance();// 设置线程池中最大线程数pool->setMaxThreadCount(5);// 创建并启动任务for (int i = 0; i < 10; ++i) {Task *task = new Task();// 如果不设置,则任务执行完毕后会自动删除task->setAutoDelete(true);pool->start(task);}// 等待所有任务完成,你可以设置一个超时或者无限等待pool->waitForDone();

运行效果

image-20240216171202923

这个源码都没有用到界面,如果要用到界面,那么在线程里面就需要发送信号了,因为大佬们都在推荐说线程里面不要操作UI的内容

☞ 源码

源码链接:GitHub仓库自取

使用方法:☟☟☟


博客签名2021

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/685958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode hot100不同路径Ⅱ

本题和之前做的不同路径类似&#xff0c;区别是本题中加入了障碍&#xff0c;遇到障碍之后需要避开&#xff08;注意&#xff0c;这里依旧是只能向下向右移动&#xff09;&#xff0c;那么也就是说&#xff0c;有障碍的点是到达不了的&#xff0c;并且 &#xff0c;我在初始化的…

Gitee入门之工具的安装

一、gitee是什么&#xff1f; Gitee&#xff08;码云&#xff09;是由开源中国社区在2013年推出的一个基于Git的代码托管平台&#xff0c;它提供中国本土化的代码托管服务。它旨在为个人、团队和企业提供稳定、高效、安全的云端软件开发协作平台&#xff0c;具备代码质量分析、…

力扣1732. 找到最高海拔(前缀和)

Problem: 1732. 找到最高海拔 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.求取数组gain的大小 n n n; 2.定义一个大小为 n 1 n 1 n1的数组preSum; 3.先求取前 n n n个元素的前缀和&#xff0c;再最后单独处理preSum[n];其中preSum[n] preSum[n - 1] gai…

网络安全最典型基础靶场-DVWA-本地搭建与初始化

写在前面&#xff1a; 之前也打过这个 DVWA 靶场&#xff0c;但是是在虚拟机环境下的一个小块分区靶场&#xff1b; 本篇博客主要介绍在本地搭建 DVWA 靶场以及靶场的初始化&#xff0c;后续会陆续更新通关教程。 由于我们是在本地搭建&#xff0c;则需要基于你已经装好 phpstu…

【Java程序员面试专栏 Java领域】Java集合 核心面试指引

关于Java 集合部分的核心知识进行一网打尽,主要包括Java各类集合以及Java的HashMap底层原理,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 集合基本概念和比较 关于集合的基本分类和知识 Java集合有哪些种类 Java 集合, 也叫作容器…

云计算基础-计算虚拟化-CPU虚拟化

CPU指令系统 在CPU的工作原理中&#xff0c;CPU有不同的指令集&#xff0c;如下图&#xff0c;CPU有4各指令集&#xff1a;Ring0-3&#xff0c;指令集是在服务器上运行的所有命令&#xff0c;最终都会在CPU上执行&#xff0c;但是CPU并不是说所有的命令都是一视同仁的&#xf…

跟着pink老师前端入门教程(JavaScript)-day02

三、变量 &#xff08;一&#xff09;变量概述 1、什么是变量 白话&#xff1a;变量就是一个装东西的盒子 通俗&#xff1a;变量是用于存放数据的容器&#xff0c;通过变量名获取数据&#xff0c;甚至数据可以修改 2、变量在内存中的存储 本质&#xff1a;变量是程序在内存…

HarmonyOS一杯冰美式的时间 -- 验证码框

一、前言 像是短密码、验证码都有可能需要一个输入框&#xff0c;像是如下&#xff1a; 恰好在写HarmonyOS的时候也需要写一个验证码输入框&#xff0c;但是在实现的时候碰了几次灰&#xff0c;觉得有必要分享下&#xff0c;故有了此篇文章。 如果您有任何疑问、对文章写的不…

Unity 2D Spine 外发光实现思路

Unity 2D Spine 外发光实现思路 前言 对于3D骨骼&#xff0c;要做外发光可以之间通过向法线方向延申来实现。 但是对于2D骨骼&#xff0c;各顶点的法线没有向3D骨骼那样拥有垂直于面的特性&#xff0c;那我们如何做2D骨骼的外发光效果呢&#xff1f; 理论基础 我们要知道&a…

书生·浦语-模型评测opencompass

大预言模型评测 模型评测包括主管评测与客观评测 测试模型对提示词的敏感性&#xff0c;或通过提示词获得更准确地答案 主流评测框架 opencompass评测平台 作业

智慧公厕:让智慧城市的公共厕所焕发“智慧活力”

智慧城市的建设已经进入了一个新的阶段&#xff0c;不仅仅是智慧交通、智慧环保&#xff0c;如今甚至连公厕都开始迎来智慧化时代。智慧公厕作为智慧城市的神经末梢&#xff0c;正在通过信息化、数字化和智慧化的方式&#xff0c;实现全方位的精细化管理。本文以智慧公厕源头专…

Flink理论—Flink架构设计

Flink架构设计 Flink 是一个分布式系统&#xff0c;需要有效分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器&#xff0c;例如Hadoop YARN&#xff0c;但也可以设置作为独立集群甚至库运行,例如Spark 的 Standalone Mode 本节概述了 Flink 架构&…

初识最短路径

一.最短路径的介绍 最短路径是图论和网络分析中一个重要的概念&#xff0c;它指的是在一个图或网络中连接两个节点或顶点的路径中&#xff0c;具有最小权重总和的路径。这个权重可以表示为路径上边或弧的长度、耗费、时间等&#xff0c;具体取决于问题的背景和应用场景。 如果你…

【STM32 CubeMX】SPI层次结构SPI协议与SPI控制器结构

文章目录 前言一、SPI 程序层次1.1 硬件原理图1.2 硬件框图1.3 软件层次 二、SPI协议2.1 硬件连线2.2 如何访问SPI设备2.3 SPI 框图 总结 前言 随着嵌入式系统的迅猛发展&#xff0c;STM32系列微控制器在各种应用中得到广泛应用。在嵌入式系统设计中&#xff0c;串行外设接口&…

牛客网SQL进阶123:高难度试卷的得分的截断平均值

官网链接&#xff1a; SQL类别高难度试卷得分的截断平均值_牛客题霸_牛客网牛客的运营同学想要查看大家在SQL类别中高难度试卷的得分情况。 请你帮她从exam_。题目来自【牛客题霸】https://www.nowcoder.com/practice/a690f76a718242fd80757115d305be45?tpId240&tqId2180…

matplotlib从起点出发(13)_Tutorial_13_Autoscaling

0 自动放缩 轴上的限制可以手动设置&#xff08;例如ax.set_xlim(xmin, xmax))&#xff0c;或者Matplotlib可以根据Axes上已有的数据自动设置它们。此种放缩行为有许多选项&#xff0c;如下所述。 我们将从一个简单的折线图开始&#xff0c;显示自动缩放将轴限制扩展到数据的…

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G题解

题目 在一个果园里&#xff0c;多多已经将所有的果子打了下来&#xff0c;而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。 每一次合并&#xff0c;多多可以把两堆果子合并到一起&#xff0c;消耗的体力等于两堆果子的重量之和。可以看出&#xff0c;所…

绿色化 数据库 MongoDB 和 mysql 安装

绿色化 数据库 MongoDB 和 mysql 安装 【1.1】 前言 为什么要绿色化 安装呢&#xff1f;因为系统老升级&#xff0c;老重装&#xff01;&#xff01;也方便了解下数据库配置和库在那 绿色软件喜欢一般放在 D盘tools目录里 D:\tools\ 数据库 MongoDB D:\tools\MongoDB 数…

Mysql第二关之存储引擎

简介 所有关于Mysql数据库优化的介绍仿佛都有存储引擎的身影。本文介绍Mysql常用的有MyISAM存储引擎和Innodb存储引擎&#xff0c;还有常见的索引。 Mysql有两种常见的存储引擎&#xff0c;MyISAM和Innodb&#xff0c;它们各有优劣&#xff0c;经过多次优化和迭代&#xff0c;…

代码随想录算法训练营第十九天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

654.最大二叉树 刷题https://leetcode.cn/problems/maximum-binary-tree/description/文章讲解https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html视频讲解https://www.bilibili.com/video/BV1MG411G7ox/?vd_sourceaf4853e80f89e28094a5fe…