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.hqwc.cn/news/473586.html

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

相关文章

【大厂AI课学习笔记】【2.1 人工智能项目开发规划与目标】(6)特征工程初步

特征工程是一个非常重要的概念&#xff0c;从特征工程可以领会到机器学习的真谛。 特征工程就是从原始数据转换为特征向量的过程。 特征工程的特点&#xff1a; 特征工程是机器学习中很重要的起始步骤&#xff0c;直接影响效果&#xff0c;需要大量的时间。 数据和特征决定了…

究极小白如何自己搭建一个自动发卡网站-独角数卡

本人从来没接触过建站&#xff0c;我之前都是在TB上花90叫别人给我搭建的网站&#xff0c;前几天这个TB店倒闭跑路了&#xff0c;而我的发卡网也打不开了&#xff0c;没办法&#xff0c;逼上梁山&#xff0c;自己捣鼓出来了&#xff01;下面是2023/4/2自己建好的&#xff01; …

【IO流】FileOutputStream 字节输出流

FileOutputStream 字节输出流 1. 概述2. 作用3. 书写步骤4. 构造方法5. 换行写6. 续写7. 注意事项 1. 概述 FileOutputStream 是 Java 中用于向文件写入字节数据的输出流类。它用于创建一个文件输出流&#xff0c;该流用于将数据写入文件。 功能&#xff1a;FileOutputStream …

RocketMQ快速入门: linux安装RocketMQ并配置开机自启

0. 引言 针对rocketMQ的学习&#xff0c;首当其冲的就是正确安装服务&#xff0c;所以我们今天来看linux下如何安装rocketmq及其控制台服务&#xff0c;并设置各个服务的开机自启 1. 安装 因为rocketmq是基于java的&#xff0c;所以需要大家提前安装好java环境&#xff0c;这…

云计算基础-存储虚拟化(深信服aSAN分布式存储)

什么是存储虚拟化 分布式存储是利用虚拟化技术 “池化”集群存储卷内通用X86服务器中的本地硬盘&#xff0c;实现服务器存储资源的统一整合、管理及调度&#xff0c;最终向上层提供NFS、ISCSI存储接口&#xff0c;供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…

EasyUI动态加载组件

要实现如下的效果&#xff0c;在表格中显示进度条 主要是需要再次初始化组件&#xff0c;借用ChatGPT的意思是&#xff1a; 在许多 JavaScript UI 框架中&#xff0c;包括 EasyUI&#xff0c;在动态地创建或插入新的 DOM 元素后&#xff0c;通常需要手动初始化相关的组件或特性…

每日OJ题_算法_递归④力扣24. 两两交换链表中的节点

目录 ④力扣24. 两两交换链表中的节点 解析代码 ④力扣24. 两两交换链表中的节点 24. 两两交换链表中的节点 难度 中等 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法&#xff0c;目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值&#xff0c;根据比较结果来确定每个像素点的状态&#xff08;前景或背景&#xff09;。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java)

Codeforces Round 926 (Div. 2) B. Sasha and the Drawing (Java) 比赛链接&#xff1a;Codeforces Round 926 (Div. 2) B题传送门&#xff1a;B. Sasha and the Drawing 题目&#xff1a;B. Sasha and the Drawing Example input 3 4 3 3 3 10 3 9 4 7 7 11 2 3output 2 …

人工智能学习与实训笔记(四):神经网络之NLP基础—词向量

人工智能专栏文章汇总&#xff1a;人工智能学习专栏文章汇总-CSDN博客 本篇目录 四、自然语言处理 4.1 词向量 (Word Embedding) 4.1.1 词向量的生成过程 4.1.2 word2vec介绍 4.1.3 word2vec&#xff1a;skip-gram算法的实现 4.2 句向量 - 情感分析 4.2.1 LSTM (Long S…

【Python】测量WAV文件播放时长

问题 windows播放WAV音频文件&#xff0c;一般使用API函数&#xff0c;如PlaySound。实际使用发现&#xff0c;从调用PlaySound到实际开始播放存在200ms以上的延时&#xff0c;在游戏编程中音效实时性是个需要解决的问题。 本文主要讨论&#xff0c;windows播放WAV文件的衍生…

MySQL 基础知识(九)之视图

目录 1 视图的介绍 2 视图算法 3 创建视图 4 查看视图结构 5 修改视图 6 删除视图 7 参考文档 1 视图的介绍 视图是一张并不存储数据的虚拟表&#xff0c;其本质是根据 SQL 语句动态查询数据库中的数据。数据库中只存放了视图的定义&#xff0c;通过 SQL 语句使用视图时…