QtApplets-线程池

news2024/12/23 14:44:27
头图

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.coloradmin.cn/o/1452268.html

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

相关文章

Netty中的适配器、Handler共享和资源管理

ChannelHandler的适配器 有一些适配器类可以将编写自定义的ChannelHandler所需要的工作降到最低限度&#xff0c; 因为它们提供了定义在对应接口中的所有方法的默认实现。因为有时会忽略那些不感兴趣的 事件&#xff0c;所以Netty提供了抽象积累ChannelInboundHandlerAdapter(…

SORA:OpenAI最新文本驱动视频生成大模型技术报告解读

Video generation models as world simulators&#xff1a;作为世界模拟器的视频生成模型 1、概览2、Turning visual data into patches&#xff1a;将视觉数据转换为补丁3、Video compression network&#xff1a;视频压缩网络4、Spacetime Latent Patches&#xff1a;时空潜在…

HTTP缓存技术

大家好我是苏麟 , 今天说说HTTP缓存技术 . 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) HTTP缓存技术 HTTP 缓存有哪些实现方式? 对于一些具有重复性的 HTTP 请求&#xff0c;比如每次请求得到的数据都一样的&#xff0c;我们可以把这对「请求-响…

Python爬虫之Splash详解

爬虫专栏&#xff1a;http://t.csdnimg.cn/WfCSx Splash 的使用 Splash 是一个 JavaScript 渲染服务&#xff0c;是一个带有 HTTP API 的轻量级浏览器&#xff0c;同时它对接了 Python 中的 Twisted 和 QT 库。利用它&#xff0c;我们同样可以实现动态渲染页面的抓取。 1. 功…

交换排序(冒泡排序和快速排序)

交换排序 冒泡排序 传统方法&#xff1a; for (int i 0; i < numsSize - 1; i) {for (int j 0; j < numsSize - 1 - i; j) {if (nums[j] > nums[j 1]) {Swap(&nums[j], &nums[j 1]);}} } 方法二&#xff1a; while循环for循环 int end numsSize - 1…

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

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

Netty中的内置通信模式、Bootstrap和ChannelInitializer

内置通信传输模式 NIO:io.netty.channel.socket.nio 使用java.nio.channels包作为基础–基于选择器的方式Epoll:io.netty.channel.epoll由JNI驱动的epoll()和非阻塞IO.这个传输支持只有在Linux上可用的多种特性&#xff0c;如果SO_REUSEPORT&#xff0c;比NIO传输更快&#xf…

视觉slam十四讲学习笔记(六)视觉里程计 1

本文关注基于特征点方式的视觉里程计算法。将介绍什么是特征点&#xff0c;如何提取和匹配特征点&#xff0c;以及如何根据配对的特征点估计相机运动。 目录 前言 一、特征点法 1 特征点 2 ORB 特征 FAST 关键点 BRIEF 描述子 3 特征匹配 二、实践&#xff1a;特征提取…

计算机网络——14CDN

CDN 视频流化服务和CDN&#xff1a;上下文 视频流量&#xff1a;占据着互连网大部分的带宽 Netflix&#xff0c;YouTube&#xff1a;占据37%&#xff0c;16%的下行流量 挑战&#xff1a;规模性-如何服务~1B用户&#xff1f; 单个超级服务器无法提供服务&#xff08;为什么&am…

第7章 Page442~446 7.8.9智能指针

指向堆内存的指针&#xff0c;很容易忘了释放&#xff1a; int foo() {int* p new int(9);cout << *p << endl;return *p; } 为什么要用指针 使用堆数据有以下几个目的&#xff08;也可称为作用&#xff09;如表7-18所列 表7-18 使用堆数据的常见目的 使用堆数…

阿里云服务器租用价格表(2024更新)

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

数据结构:4_二叉树

二叉树 一.树概念及结构 1. 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个**特殊的…

让你的资金运动起来,金钱的聪明处理方式

一、教程描述 本套教程主要讲解了金融思维和财务思维&#xff0c;常见投资工具的实操技巧&#xff0c;资产配置方案的制定方法&#xff0c;等等&#xff0c;将会重构你现有的投资观念&#xff0c;提升你认知的宽度和深度&#xff0c;可以轻松读懂财经新闻&#xff0c;不仅学会…

单片机学习笔记---LED呼吸灯直流电机调速

目录 LED呼吸灯 直流电机调速 模型结构 波形 定时器初始化函数 中断函数 主程序 上一节讲了电机的工作原理&#xff0c;这一节开始代码演示&#xff01; 我们上一篇说Ton的时间长Toff时间短电机会快&#xff0c;Ton的时间短Toff时间长电机会慢 并且我们还要保证无论Ton和…

红队ATKCK|红日靶场Write-Up(附下载链接)

网络拓扑图 下载地址 在线下载&#xff1a; http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ 百度网盘 链接&#xff1a;https://pan.baidu.com/s/1nlAZAuvni3EefAy1SGiA-Q?pwdh1e5 提取码&#xff1a;h1e5 环境搭建 通过上述图片&#xff0c;web服务器vm1既能用于外…

【网络安全】什么样的人适合学?该怎么学?

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题&#xff1a; 什么样的人适合学习网络安全&#xff1f;我适不适合学习网络安全&#xff1f; 当然&#xff0c;产生这样的疑惑并不奇怪&#xff0c;毕竟网络安全这个专业在2017年才调整为国家一级…

【BUUCTF 加固题】Ezsql 速通

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

隐函数的求导【高数笔记】

1. 什么是隐函数&#xff1f; 2. 隐函数的做题步骤&#xff1f; 3. 隐函数中的复合函数求解法&#xff0c;与求导中复合函数求解法有什么不同&#xff1f; 4. 隐函数求导的过程中需要注意什么&#xff1f;

Day01 javaweb开发——tlias员工管理系统

任务介绍 完成部门管理和员工管理的增删改查功能 环境搭建 前端---->后端---->数据库 准备数据库表创建springboot工程&#xff08;web、mybatis、mysql驱动、lombok&#xff09;application.properties中引入mybatis配置信息&#xff0c;准备对应的实体类准备三层架…

Midjourney绘图欣赏系列(四)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…