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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫之牛刀小试(十):爬取某宝手机商品的销量,价格和店铺

首先淘宝需要登录&#xff0c;这一点如果用selenium如何解决&#xff0c;只能手动登录&#xff1f;如果不用selenium&#xff0c;用cookies登录也可。但是验证码又是一个问题&#xff0c;现在的验证码五花八门&#xff0c;难以处理。 我们回到正题&#xff0c;假设你已经登录上…

【图论经典题目讲解】CF786B - Legacy 一道线段树优化建图的经典题目

C F 786 B − L e g a c y \mathrm{CF786B - Legacy} CF786B−Legacy D e s c r i p t i o n \mathrm{Description} Description 给定 1 1 1 张 n n n 个点的有向图&#xff0c;初始没有边&#xff0c;接下来有 q q q 次操作&#xff0c;形式如下&#xff1a; 1 u v w 表示…

P1219 八皇后 (dfs 表格坐标关系)

一个正常的dfs&#xff08;数据范围1-13&#xff09;&#xff0c;发现一条对角线上&#xff0c;分别符合和与差相等。因为有负数&#xff0c;这里我最开始开的是map&#xff0c;发现卡了最后一个点TLE&#xff0c;记录一下时间复杂度&#xff08; map&#xff0c;set的时间复杂…

算法--数论二

这里写目录标题 高斯消元高斯消元求线性方程组用途高斯消元的数学思想例题代码 二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 高斯消元 高斯消元求线性方程组 用途 这个…

《Linux 简易速速上手小册》第1章: Linux 系统基础(2024 最新版)

文章目录 1.1 Linux 操作系统概述1.1.1 重点基础知识1.1.2 重点案例&#xff1a;配置 Apache Web 服务器1.1.3 拓展案例 1&#xff1a;配置 SSH 服务以进行远程管理1.1.4 拓展案例 2&#xff1a;使用 Cron 定时任务 1.2 选择合适的 Linux 发行版1.2.1 重点基础知识1.2.2 重点案…

淘宝项目实战相关知识点

淘宝各个方面的布局大部分都是常规操作&#xff0c;在这里我就简单记录一下练习过程中的相关知识点&#xff0c;比较简短。相关知识点如下&#xff1a; 行高的取值 假设font-size为16px line-height:normal; line-height:1.5;24px&#xff0c;先继承后计算 line-height:200%;3…

win7自带截图工具保存失效解决办法

今日发现一台远航技术的win7中自带的截图工具使用时正常&#xff0c;保存图片时没有弹出保存位置的对话窗口&#xff0c;无法正常保存图片。解决方案如下&#xff1a; 1、进入注册表编辑器。开始-搜索程序和文件-输入 regedit 按下回车键&#xff0c;打开注册表&#xff1b; 2、…

MySQL篇----第十三篇

系列文章目录 文章目录 系列文章目录前言一、MySQL 支持事务吗?二、MySQL 里记录货币用什么字段类型好三、MySQL 有关权限的表都有哪几个?四、列的字符串类型可以是什么?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转…

C语言指针

小伙伴们应该都知道在C语言中指针是非常难学的&#xff0c;指针它经常与内存联系&#xff0c;指向存放数据的地址&#xff0c;这样据很容易使小伙伴们绕晕&#xff0c;下面我就来简单解析一下指针&#xff01; 一、内存和地址 像我们学生一样&#xff0c;每个学生都拥有自己的…

C语言希尔排序详解!!!速过

目录 希尔排序是什么&#xff1f; 关于时间复杂度 希尔排序的源代码 希尔排序源代码的详解 希尔排序是什么&#xff1f; 之前我们说了三个排序&#xff08;插入排序&#xff0c;选择排序&#xff0c;冒泡排序&#xff09;有需要的铁铁可以去看看之前的讲解。 但因为之前的…

老和尚背女人过河,小和尚不理解,返程路上睡大觉——早读

回程路上&#xff01; 引言代码第一篇 人民日报 夜读 新的一年成为最好的自己&#xff0c;遇见更好的生活第二篇(跳) 人民日报 来了 新闻早班车要闻社会政策 结尾 引言 今天应该算是回归正常的节奏了 这个点在高铁上爬了一下 没想到新闻早班车的排名终于回归正常 也就意味着大家…

SSM整合进阶操作

SSM整合&#xff1a; http://t.csdnimg.cn/0lgfl 响应格式统一 我们要保证一个项目中所有接口返回的数据格式的统一。这样无论是前端还是移动端开发获取到我们的数据后都能更方便的进行统一处理。 所以我们定义以下结果封装类 /*** 在将Java对象转换为JSON格式时&#xff0c;…

理解并实现OpenCV中的图像平滑技术

导读 图像模糊&#xff08;也称为图像平滑&#xff09;是计算机视觉和图像处理中的基本操作之一。模糊图像通常是噪声减少、边缘检测和特征提取等应用的第一步。在本博客中&#xff0c;我们将重点介绍如何使用Python中的OpenCV库应用多种模糊技术。 理论概述&#xff1a; 基本…

杨中科 ASP.NET DI综合案例

综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务&#xff0c;然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置&#xff0c;可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…

【Linux】 Linux 小项目—— 进度条

进度条 基础知识1 \r && \n2 行缓冲区3 函数介绍 进度条实现版本 1代码实现运行效果 版本2 Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 基础知识 1 \r &&a…

一文读懂深度学习中的各种卷积 !!

文章目录 前言 1、卷积与互相关 2、3D 卷积 3、转置卷积&#xff08;去卷积&#xff09; 4、扩张卷积 5、可分卷积 6、分组卷积 前言 我们都知道卷积的重要性&#xff0c;但你知道深度学习领域的卷积究竟是什么&#xff0c;又有多少种类吗&#xff1f;研究学者Kunlun Bai发布了…

2月12号

第一种判断方式 if (n 10) 更好&#xff0c;因为它具有更好的可读性、可以避免误操作&#xff0c;并符合常见的编程习惯和约定

DSA 经典数据结构与算法 学习心得和知识总结(三) |有向无环图及其应用

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《算法导论》第三版 就是这本被封神的杰作&#xff0c;就是它&#x1f926; 2、参考书籍&#xff1a;《数据结构》严奶奶版 3、参考书…

SpringCloud-搭建Nacos配置中心

一、Nacos 功能介绍 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一个分布式服务注册、配置管理&#xff0c;以及服务健康管理平台。在微服务架构中&#xff0c;配置管理是至关重要的一环&#xff0c;Nacos 提供了可靠、动态的配置…

月薪30K-100K,新一波工作机会来了,你准备好了吗

纯血版鸿蒙发布&#xff0c;开启一个新时代 1月18日下午&#xff0c;在“鸿蒙千帆起”发布会上&#xff0c;华为揭秘鸿蒙生态和纯血鸿蒙星河版HarmonyOS NEXT进阶的新进展。“几年来&#xff0c;在众多伙伴和开发者的共同努力下&#xff0c;鸿蒙生态设备数已达8亿&#xff0c;…