【Qt】Qt多线程开发—实现多线程设计的四种方法

2023-05-16

Qt—使用Qt实现多线程设计的四种方法

文章目录

        • Qt—使用Qt实现多线程设计的四种方法
        • 一、写在前面
        • 二、【方法一】 QThread:带有可选事件循环的底层API
        • 三、【方法二】 QThreadPool和QRunnable:重用线程
        • 四、【方法三 】Qt并发:使用高级API
        • 五、【方法四】 WorkerScript:QML中的线程化
        • 六、如何选择上述四种不同的多线程设计的解决方案
        • 七、Qt多线程应用设计示例

一、写在前面

​ 这篇文章内容是:关于Qt多线程应用设计的。
在Qt中提供了四种方法来进行多线程编程和设计。合理的选择对应的方法来满足实际开发中的应用场景。

二、【方法一】 QThread:带有可选事件循环的底层API

QThread是Qt中所有线程控件的基础,每个QThread实例代表和控制着一个线程。使用QThread创建线程有两种方法:1)、可以直接实例化创建,2)也可以子类化它进行线程创建。

1、实例化QThread:提供了一个并行事件循环,允许在辅助线程中调用QObject槽函数。

2、继承QThread:允许应用程序在启动事件循环之前初始化新线程,或者在没有事件循环的情况下运行并行代码。

三、【方法二】 QThreadPool和QRunnable:重用线程

​ 频繁的创建和销毁线程的代价可能会很高。为了减少这种开销,可以对新任务重用现有的线程。QThreadPool是可重用QThreads的集合。

要在QThreadPool的一个线程中运行代码,需要重新实现QRunnable::run()并实例化子类化的QRunnable

使用````QThreadPool::start()```将QRunnable放到QThreadPool的运行队列中。当线程可用时,QRunnable::run()中的代码将在该线程中执行。

【备注】:每个Qt应用程序都有一个全局线程池,可以通过QThreadPool::globalInstance()访问它。这个全局线程池根据CPU中的核心数量将自动维护最佳的线程数量。但是,在实际开发中,也可以显式地创建和管理一个单独的QThreadPool

四、【方法三 】Qt并发:使用高级API

​ Qt并发模块提供了许多高级功能,用来处理一些常见的并行计算模式。例如:mapfilterreduce。Qt并发与使用QThreadQRunnable不同,这些函数不需要使用底层的线程原语,如互斥或信号量等。相反,它们返回的是一个QFuture对象,该对象可用于在线程准备或者完成时自动检索函数的结果;QFuture还可以用来查询、计算进度和暂停/恢复/取消计算。为了方便起见,QFutureWatcher允许通过信号和槽与QFutures进行交互。

​ Qt Concurrent的并行计算模型:mapfilterreduce等算法自动将计算分配到所有可用的处理器核心上,因此,我们今天编写的应用程序在以后部署到拥有更多内核的系统时将继续得以扩展和使用,这非常方便。

​ 这个模块还提供了QtConcurrent::run()函数,它可以在另一个线程中运行任何的函数。但是,QtConcurrent::run()只支持mapfilterreduce函数可用的特性子集,QFuture可用于检索函数的返回值并检查线程是否正在运行。

​ 但是,对QtConcurrent::run()的调用只使用一个线程,不能暂停/恢复/取消,也不能查询进程。

五、【方法四】 WorkerScript:QML中的线程化

WorkerScriptQML类型允许JavaScript代码与GUI线程并行运行。每个WorkerScript实例可以附加一个.js脚本。调用WorkerScript.sendMessage()时,脚本将在单独的线程(和单独的QML上下文)中运行。当脚本运行完成时,它可以将一个回复发送回GUI线程,该线程将调用WorkerScript.onMessage()信号处理程序。

使用WorkerScript类似于使用已移动到另一个线程的worker QObject,数据通过信号在线程之间进行传输。

【注】这种方法在QML中使用

六、如何选择上述四种不同的多线程设计的解决方案

​ 如上所示,Qt为开发多线程应用程序提供了不同的解决方案。对于多线程应用程序的正确解决方案取决于:新线程的用途和线程的生命周期。下面是Qt几种多线程技术机制的比较:

序号特点QThreadQRunnable 和QThreadPoolQtConcurrent::run()Qt Concurrent(Map/Filter/Reduce)WorkerScript
1开发语言C++C++C++C++QML
2是否可以指定线程优先级YesYes
3线程是否可以运行一个事件循环Yes
4线程通过信号接收数据更新Yes (received by a worker QObject)Yes (received by WorkerScript)
5线程是否可以使用信号来控制Yes (received by QThread)Yes (received by QFutureWatcher)
6线程是否可以通过QFuture来监控部分地Yes
7是否拥有内置能力:取消/暂停/恢复Yes

七、Qt多线程应用设计示例

线程生命周期操作解决方法
一次调用在另一个线程中运行一个新的线性函数,可以选择在运行期间进行进度更新。Qt提供了不同的解决方案: 将该函数放在QThread::run()的重新实现中,并启动QThread。发出信号更新进度。将该函数放在QRunnable::run()的重新实现中,并将QRunnable添加到QThreadPool中。写入线程安全的变量以更新进度。使用QtConcurrent:: Run()运行函数。写入线程安全的变量以更新进度。
一次调用在另一个线程中运行一个现有函数并获取它的返回值。使用QtConcurrent:: Run()运行函数。 让QFutureWatcher在函数返回时发出finished()信号,并调用QFutureWatcher::result()来获取函数的返回值。
一次调用在另一个线程中运行一个现有函数并获取它的返回值。使用QtConcurrent:: Run()运行函数。让QFutureWatcher在函数返回时发出finished()信号,并调用QFutureWatcher::result()来获取函数的返回值。
一次调用使用所有可用的内核对容器(Container)的所有项执行操作。例如,从图像列表生成缩略图。使用QtConcurrent的QtConcurrent::filter()函数来选择容器元素,使用QtConcurrent::map()函数来对每个元素应用一个操作。要将输出换算成单个结果,可以使用QtConcurrent:: filteredreduce()和QtConcurrent::mappedReduced()。
一次调用/永久存在在纯QML应用程序中完成长时间的计算,并在结果准备好时更新GUI。将计算代码放在.js脚本中,并将其附加到WorkerScript实例。调用WorkerScript.sendMessage()在新线程中启动计算。让脚本也调用sendMessage(),将结果传递回GUI线程。在onMessage中处理结果并在那里更新GUI。
永久存在在另一个线程中有一个对象,它可以根据请求执行不同的任务,并且/或者可以接收新的数据来处理。子类化一个QObject来创建一个worker。实例化这个worker对象和一个QThread。将worker移动到新线程。通过排队的信号和槽连接向worker对象发送命令或数据。
永久存在在另一个线程中重复执行开销较大的操作,其中该线程不需要接收任何信号或事件。直接在QThread::run()的重新实现中写入无限循环。在没有事件循环的情况下启动线程。让线程发出信号将数据发送回GUI线程。

搜索/关注【嵌入式小生】vx公众号,获取更多精彩内容>>>>
请添加图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Qt】Qt多线程开发—实现多线程设计的四种方法 的相关文章

  • LINUX如何设置numlock键开机状态

    第一步 xff1a 安装numlockx xff0c 输入命令 xff1a sudo yum install numlockx 第二步 xff1a 用 vim 打开 etc lightdm lightdm conf文件 xff0c 如果文件
  • Mybatis-plus扩展

    这玩意类似于mp自带的basemapper Copyright c 2011 2020 baomidou jobob 64 qq com lt p gt Licensed under the Apache License Version 2
  • Photoshop中的“磁性套索”背后算法的OpenCV实现

    本文由Markdown语法编辑器编辑完成 1 PS中的磁性套索工具简介 xff1a 本示例是基于Photoshop CS4的工具栏 xff1a 2 磁性套索工具背后的算法Livewire原理 xff1a 3 Livewire Segment
  • 轻量化网络mobileNet与ShuffleNet

    摘要 最近出了一篇旷视科技的孙剑团队出了一篇关于利用Channel Shuffle实现的卷积网络优化 ShuffleNet 我关注了一下 xff0c 原理相当简单 它只是为了解决分组卷积时 xff0c 不同feature maps分组之间的
  • 人脸比对(1:N)

    第 1章 前言 设计出人脸1 xff1a N xff0c 随着N的增大准确率降低最小的解决方案具有很强的现实意义 人脸1 xff1a N的框架大致分为 xff1a 人脸检测 人脸对齐 人脸映射与人脸识别LOSS的设计 xff0c 结构如下图
  • 商家招牌的分类与检测

    现实生活中的招牌各种各样 xff0c 千变万化 针对初赛 xff0c 在现实世界中 xff0c 选取100类常见的招牌信息 xff0c 如肯德基 麦当劳 耐克等 将最终的分类结果上传到比赛平台 数据典型图像 a 样本类别多样性 b 每类样本
  • TensorRT简介--高性能深度学习支持引擎

    上文简单提到了TensorRT的基础与onnx转换 xff1a 基于TensorRT的神经网络推理与加速 xff1a https blog csdn net intflojx article details 81712651 后面看到老板的
  • raspberry install mysql-connector-python

    wget http cdn mysql com Downloads Connector Python mysql connector python 1 0 11 zip unzip mysql connector python 1 0 11
  • ubuntu安装TensorFlow(支持不同版本)

    CUDA 43 CUDNN准备 xff1a 1 安装NVIDIA驱动 xff08 1 xff09 查询NVIDIA驱动 首先去官网 http www nvidia com Download index aspx lang 61 en us
  • 基于变换不变低秩纹理(TILT)的图像校正(附代码)

    原理简介 事实上 xff0c 对于未加旋转的图像 xff0c 由于图像的对称性与自相似性 xff0c 我们可以将其看作是一个带噪声的低秩矩阵 当图像由端正发生旋转时 xff0c 图像的对称性和规律性就会被破坏 xff0c 也就是说各行像素间
  • 最小可觉察误差(JND)与图像压缩

    1 JND算法背景 意义 1算法的概述 最小可觉察误差 JND Just Noticeable Distortion 用于表示人眼不能察觉的最大图像失真 xff0c 体现了人眼对图像改变的容忍度 在图像处理领域 xff0c JND 可以用来
  • 彩色图像压缩(颜色量化)

    调色板色度压缩 调色板的概述 大多数彩色图像采集设备及图像处理软件都采用 24 位真彩色图像数据结构记录图像信息 xff0c 即以红 xff08 R xff09 绿 xff08 G xff09 蓝 xff08 B xff09 彩色模式记录色
  • SSD论文解读

    1 论文简述 题目 SSD Single Shot MultiBox Detector 作者 Wei Liu Dragomir Anguelov Dumitru Erhan Christian Szegedy Scott Reed Chen
  • FaceNet项目实践

    一 论文的原理与复现 1 论文复现 Database xff1a LFW db xff08 论文采用 xff0c rgb图算是较大的典型数据集 xff09 LFW数据库 总共有 13233 张 JPEG 格式图片 xff0c 属于 5749
  • 深度学习领域最新的技术(CV、NLP)

    人工智能正在日益渗透到所有的技术领域 而深度学习 DL 是目前最活跃的分支 最近几年 xff0c DL取得了许多重要进展 其中一些因为事件跟大众关系密切而引人瞩目 xff0c 而有的虽然低调但意义重大 深度学习从业人员应该保持足够的嗅觉 x
  • Linux文件名称乱码GBK转UTF8重命名

    因Java项目运行于Linux之上 xff0c 系统字符集为en US UTF 8 xff08 可通过locale命令查看 xff09 xff0c 而项目Java启动参数设置字符集为GBK 通过上传功能上传的附件文件名称为GBK格式 xff
  • Linux系列讲解 —— 对装有Ubuntu18.04系统的硬盘进行数据迁移

    目录 0 背景介绍1 参照旧硬盘的分区对新硬盘进行分区2 将旧硬盘分区数据迁移到新硬盘对应分区中补充 xff1a 1 新硬盘启动有问题时的对策 需要启动U盘 0 背景介绍 现有一块装有ubuntu系统的旧硬盘 sda xff0c 电脑主机的
  • GPG错误:没有公钥无法验证签名的解决办法

    GPG错误 xff1a 没有公钥无法验证签名的解决办法 sudo apt key adv keyserver hkp keyserver ubuntu com 80 recv 后面加入密钥 xff0c 就能导入公钥了
  • linux中添加环境变量

    linux中添加环境变量 一般是在 etc profile中添加环境 xff0c 但是建议在 etc profile d 下创建一个以 sh结尾的文件 vim etc profil d my env sh 输入i进入编辑模式 eg xff1
  • snprintf函数用法及与sprintf比较

    int snprintf char restrict buf size t n const char restrict format 函数说明 最多从源串中拷贝n xff0d 1个字符到目标串中 xff0c 然后再在后面加一个0 所以如果目

随机推荐

  • gin跨域时Get,Post正常Put,Delete被阻止的问题解决

    问题表现 同一个项目请求同一个服务时 xff0c Get和Post请求正常 xff0c 但是Put和Delete一直报跨域错误的问题 Access to XMLHttpRequest at 39 http 127 0 0 1 8011 ap
  • iOS绘制仪表盘,游标沿圆形轨迹移动动画

    最近碰到一个需求 xff0c 需要画一个仪表盘的页面 图上所示 计算角度 圆弧部分还好 xff0c 用CAShapeLayer 43 UIBezierPath曲线 xff0c 只要确定好圆心部分和左右两边的角度就行 这里正好说明一下 voi
  • [iOS] 如何改变一个控制器的大小?

    iOS 如何改变一个控制器的大小 1 改变控制器的VIew大小 这是只能改变控制器里面View的大小 并不会对控制器本身的显示做出视觉改变 2 改变控制的大小 方法 span class hljs comment 重置控制器的大小 span
  • 控件:UIControl 我在UITextFiled输入事件调用到

    下列事件为基类UIControl所支持 xff0c 除非另有说明 xff0c 也适用于所有控件 UIControlEventTouchDown 单点触摸按下事件 xff1a 用户点触屏幕 xff0c 或者又有新手指落下的时候 UIContr
  • iOS抖音点赞动画实现

    前言 hi 大家好 又跟大家见面了 今天给大家分享的是抖音的点赞动画的实现 废话不多说上图 本篇文章主要包含技术点 CAShapeLayer和贝赛尔曲线绘制三角形 组合动画的时间技巧我习惯写完文章的demo都附在文章底部 如果不想看原理的小
  • 必读!!只需10分钟,NAS变身赚钱神器!

    有很多朋友现在家里都有NAS xff0c 今天教大家如何利用NAS的闲置资源薅羊毛 NAS我们正常的用途是存储资料 xff0c 通过网络传输实现多设备文件互通 xff0c 但是在大部分情况下 xff0c 我们的宽带和NAS机能处于闲置状态
  • 如何利用电脑榨干闲置的带宽资源?

    电脑现在是每个家庭的必需品 xff0c 大部分人对电脑的使用方法主要是办公和游戏 xff0c 除了这两个用途外 xff0c 其实大部分人的电脑是处于闲置状态 那么 xff0c 电脑的闲置闲置时间还能做些什么呢 xff1f 今天给大家介绍一个
  • 如何善用家中闲置的带宽资源赚钱(2020版)

    CDN的全称是Content Delivery Network xff0c 即内容分发网络 xff0c 依靠部署在各地的边缘服务器 xff0c 通过中心平台的负载均衡 内容分发 调度等功能模块 xff0c 使用户就近获取所需内容 xff0c
  • 一招将闲置宽带完美利用起来

    随着我们生活水平的提高以及国家对信息化建设的推动 xff0c 大部分家庭的宽带已经进入了高速时代 xff0c 100 200M到处可见 xff0c 甚至于500M也不是什么新鲜事儿了 xff0c 宽带的速率是提高了 xff0c 不过问题也来
  • 十一、 Debian忘记密码重置

    其方式是在GRUB引导菜单下按 e 进入编辑模式直接修改用户密码 重启VPS xff0c 可以在面板重启也可以在VNC上面使用发送 CTRL 43 ALT 43 DEL 按钮直接重启 xff0c 在图示处按 e 键 xff08 若出现BIO
  • 加入共享宽带,让你的闲置宽带循环利用再变现

    共享经济是近些年来发展的一个热点名词 xff0c 因此大家也会看到一些非常多的共享产品出现在市面上 比如说大家熟悉的共享单车 xff0c 共享汽车共享充电宝等等 xff0c 但是不知道大家有没有听说过共享宽带呢 xff1f 宽带几乎是家家户
  • 一招让NAS自给自足

    网络带来了许多便利 xff0c 但又给生活带来了很多烦恼 xff0c 比如微信文档总是过期 xff0c 关键内容经常找不到 xff0c 照片备份太散乱 最近听朋友说听说前任离婚了 xff0c 我突然想重温下与她昨日的温情 xff0c 可是翻
  • 百度网盘撸用户羊毛是怎么一回事

    最近百度网盘事件闹得沸沸扬扬 xff0c 很多吃瓜小伙伴对这次事件的来龙去买不太清楚 xff0c 今天就给大家八一八百度网盘如何反撸用户引发众怒 百度对于该计划的说明 xff1a 用户参加该计划可贡献闲置网络带宽和电脑存储空间给百度 xff
  • 业务流程节点信息提示

    xfeff xfeff 该模块中主要是为了明确用户操作 让用户具体的知道该进行哪一步操作 xff0c 在登陆系统后 xff0c 系统首页中会有下面类似的流程图 xff1a 当用户完成一项操作后 xff0c 要根据流程提示其他用户进行下一步操
  • UbuntuWSL操作PA的BUG记录——AM_HOME环境变量的设定

    2021年5月更 xff0c 发现WSL2是真的香 xff0c 下次还用 x1f604 2021年4月 血亏 xff0c 建议老实用虚拟机做 xff0c WSL还是有很多未完善的地方 xff0c 不适合新手瞎折腾 问题描述 xff1a 当使
  • windows11编译OpenCV4.5.0 with CUDA(附注意事项)

    windows11编译OpenCV4 5 0 with CUDA 从OpenCV4 2 0 版本开始允许使用 Nvidia GPU 来加速推理 本文介绍最近使用windows11系统编译带CUDA的OpenCV4 5 0的过程 文中使用 特
  • OpenCV—矩阵数据类型转换cv::convertTo

    OpenCV 矩阵数据类型转换cv convertTo 函数 void convertTo OutputArray m int rtype double alpha 61 1 double beta 61 0 const 参数 m 目标矩阵
  • Mysql LIMIT使用

    原文出处 xff1a http www jb51 net article 62851 htm Mysql中limit的用法 xff1a 在我们使用查询语句的时候 xff0c 经常要返回前几条或者中间某几行数据 xff0c 这个时候怎么办呢
  • cookies的理解与chrome查看cookie

    Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存 xff0c 或是从客户端的硬盘读取数据的一种技术 Cookies是当你浏览某网站时 xff0c 由Web服务器置于你硬盘上的一个非常小的文本文件 xff0c 它可以记录
  • 【Qt】Qt多线程开发—实现多线程设计的四种方法

    Qt 使用Qt实现多线程设计的四种方法 文章目录 Qt 使用Qt实现多线程设计的四种方法一 写在前面二 方法一 QThread xff1a 带有可选事件循环的底层API三 方法二 QThreadPool和QRunnable xff1a 重用