QT QThread 线程类的使用及示例

QThread 是 Qt 框架提供的一个用于处理多线程的类,它允许开发者编写具有并发功能的应用程序,提高程序的响应速度、执行效率和用户体验。

在操作系统中,线程是进程内的执行单元,拥有独立的执行路径。每个线程有自己独立的栈空间,可以并发执行,实现任务的并行处理。QThread 封装了操作系统的线程接口,提供了一种跨平台的方式来管理和控制线程。

主要用于实现后台处理、长时间运行的任务(如文件读写、网络通信、复杂计算等),以避免阻塞主线程(用户界面线程),保持界面的流畅和响应

QThread 线程类是实现多线程的核心类。

Qt 有两种多线程的方法,其中一种是继承 QThread run()函数

另外一种是把一个继承于 QObject 的类转移到一个 Thread 里。

法二:本例通过 QObject 类继承线程,然后在 MainWindow 类里使用。通过点击一个按钮开启线程。另一个按钮点击关闭线程。另外通过加锁的操作来安全的终止一个线程。

可以通过 QMutexLocker 可以安全的使用 QMutex 以免忘记解锁。)

加锁来终止一个线程的原因:quit()exit()方法都不会中途终止线程

要马上终止一个线程可以用 terminate()方法。但是这个函数存在非常不安全的因素,Qt 官方文档不推荐使用。 但是加锁会消耗一定的性能,增加耗时。

QThread示例

程序运行效果:

点击开启线程按钮后,应用程序输出窗口每隔 2 秒打印“正在运行 doWork1 函数”,当我们点击打断线程按钮后,窗口打印出“打断 doWork1 函数”。点击打断线程,会打断 doWork1函数的循环,doWork1 函数就运行结束了。再点击开启线程,可以再次运行 doWork1 函数。

耗时的工作都放于槽函数下

工人可以有不同的工作,但是每次只能去做一份。这里不同于继承 QThread 类的线程 run(),继承 QThread 的类只有 run()在新线程里

而继承 QObject 的类,使用 moveToThread()可以把整个继承的 QObject 类移至线程里执行,所以可以有 doWork1(),doWork2()…等等耗时的操作,但是这些耗时的操作都应该作为槽函数,由主线程去调用

进入循环后使用互拆锁判断 isCanRun 变量的状态,为假即跳出 while 循环, 直到 doWork1 结束。注意,虽然 doWork1 结束了,但是线程并没有退出(结束)。因为这个类移到线程里了,直到这个类被销毁。或者使用 quit()exit()退出线程才真正的结束

工人类实例化。继承 QObject 的多线程类不能指定父对象。 工人类将自己移至 workerThread 线程里执行。 线程结束后,需要使用 deleteLater 来销毁 worker 对象和 workerThread 对象分配的内存。deleteLater 会确认消息循环中没有这两个线程的对象后销毁。

补充:

QMutex:用于保护共享资源,防止多个线程同时访问造成的数据不一致或损坏。

QReadWriteLock:比 QMutex 更灵活,提供读写锁机制,允许多个读取者同时访问但只允许一个写入者。

QSemaphoreQWaitCondition:用于更复杂的同步需求,比如控制线程的执行顺序或等待特定条件满足。

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

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

相关文章

华为仓颉编程语言正式发布,仓颉编程教程

目录 前言 基本概念 标识符 变量 类型 基础数据类型 表达式 if 表达式 while 表达式 for-in 表达式 程序结构 函数 定义函数 调用函数 lambda表达式 应用实例(遍历目录) 枚举 定义与实例化 成员访问规则 match表达式 应用实例&…

The difference between Manhattan distance and Cosine Distance

题意:为什么即使返回了相同的文本块,曼哈顿距离(Manhattan Distance)和余弦距离(Cosine Distance)之间还是存在差异? 问题背景: I am using the qdrant DB and client for embeddin…

Websocket解析及用法(封装一个通用订阅发布主题的webSocket类)

1、什么是WebSocket? websocket的目标是通过一个长连接实现与服务器全双工,双向的通信。是一种在单个TCP连接上进行全双工通信的协议,使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 js中创建websocket…

LabVIEW在机器人研究所中的应用

机器人研究所致力于机器人技术的研究与开发,涵盖工业机器人、服务机器人、医疗机器人等多个领域。研究所需要一个高效、灵活的实验控制和数据采集系统,以进行复杂的机器人实验,并对实验数据进行实时处理和分析。 项目需求 实时控制与监控&am…

使用面向对象方式编写ROS2节点

1.使用c方式创建节点 在d2lros2/chapt2/chapt2_ws/src/example_cpp/src下新建node_03.cpp,接着输入下面的代码。 #include "rclcpp/rclcpp.hpp" /* 创建一个类节点,名字叫做Node03,继承自Node. */ class Node03 : public rclcpp::Node {…

完全离线的本地问答模型LocalGPT如何实现无公网IP远程连接提问

文章目录 前言环境准备1. localGPT部署2. 启动和使用3. 安装cpolar 内网穿透4. 创建公网地址5. 公网地址访问6. 固定公网地址 前言 本文主要介绍如何本地部署LocalGPT并实现远程访问,由于localGPT只能通过本地局域网IP地址端口号的形式访问,实现远程访问…

java+mysql通讯录管理

完整代码地址如果控制台打印出现乱码,进行如下设置

【Linux】Wmware Esxi磁盘扩容

目录 一、概述 1.1 磁盘分区概念 1.2 LVM概念 二、扩容步骤 二、报错 一、概述 1.1 磁盘分区概念 在 Linux 中,每一个硬件设备都映射到一个系统的文件,对于硬盘、光驱等 IDE 或 SCSI 设备也不例外。Linux把各种 IDE 设备分配了一个由 hd 前缀组成的文…

django admin添加自己的页面

建立模型 如果要单独建一个页面,用于展示model的数据,可以新建一个model,继承自要展示的那个类 class ViewsByDayModel(ViewsByDay): # 父类为要展示的model类class Meta:proxy True # 使用代理verbose_name 每日浏览次数统计verbose_nam…

嫦娥六号平安回家,Smartbi非常荣幸参与中国航天项目

“小时不识月,呼作白玉盘。”李白的这句诗,承载了古人对月亮的美好想象与纯真童趣。今天,当我们仰望夜空,那轮明月不仅是诗词中的意象,更是科学探索的目标和梦想的寄托。 2024年6月25日14时07分,嫦娥六号返…

Redis-实战篇-什么是缓存-添加redis缓存

文章目录 1、什么是缓存2、添加商户缓存3、前端接口4、ShopController.java5、ShopServiceImpl.java6、RedisConstants.java7、查看Redis Desktop Manager 1、什么是缓存 缓存就是数据交换的缓冲区(称为Cache),是存贮数据的临时地方&#xff…

深入解析链表:解锁数据结构核心奥秘

一. 链表的定义 链表是一种线性数据结构,由一系列节点组成。每个节点包含两个部分: 数据域(Data):存储节点的数据。指针域(Pointer):存储指向下一个节点的地址。 链表的第一个节点…

SpringBoot 3.3.1 + Minio 实现极速上传和预览模式

统一版本管理 <properties><minio.version>8.5.10</minio.version><aws.version>1.12.737</aws.version><hutool.version>5.8.28</hutool.version> </properties><!--minio --> <dependency><groupId>io.m…

算法金 | 决策树、随机森林、bagging、boosting、Adaboost、GBDT、XGBoost 算法大全

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 决策树是一种简单直观的机器学习算法&#xff0c;它广泛应用于分类和回归问题中。它的核心思想是将复杂的决策过程分解成一系列简单的决…

【PyTest】玩转HTML报告:修改、汉化和优化

前言 Pytest框架可以使用两种测试报告&#xff0c;其中一种就是使用pytest-html插件生成的测试报告&#xff0c;但是报告中有一些信息没有什么用途或者显示的不太好看&#xff0c;还有一些我们想要在报告中展示的信息却没有&#xff0c;最近又有人问我pytest-html生成的报告&a…

技术驱动的音乐变革:AI带来的产业重塑

&#x1f4d1;引言 近一个月来&#xff0c;随着几款音乐大模型的轮番上线&#xff0c;AI在音乐产业的角色迅速扩大。这些模型不仅将音乐创作的门槛降至前所未有的低点&#xff0c;还引发了一场关于AI是否会彻底颠覆音乐行业的激烈讨论。从初期的兴奋到现在的理性审视&#xff0…

【算能全国产AI盒子】基于BM1688CV186AH+FPGA智能物联工作站,支持差异化泛AI视觉产品定制

在数据呈现指数级增长的今天&#xff0c;越来越多的领域和细分场景对实时、高效的数据处理和分析的需求日益增长&#xff0c;对智能算力的需求也不断增强。为应对新的市场趋势&#xff0c;凭借自身的硬件研发优势&#xff0c;携手算能相继推出了基于BM1684的边缘计算盒子&#…

IDM(Internet Download Manager)下载器的安装激活与换机方法 IDM怎么用

很多人都知道 Internet Download Manager(以下简称 IDM)是一款非常优秀的下载提速软件。它功能强大&#xff0c;几乎能下载网页中的所有数据&#xff08;包括视频、音频、图片等&#xff09;&#xff0c;且适用于现在市面上几乎所有的浏览器&#xff0c;非常受大家欢迎。IDM 是…

React 扩展

文章目录 PureComponent1. 使用 React.Component&#xff0c;不会进行浅比较2. 使用 shouldComponentUpdate 生命周期钩子&#xff0c;手动比较3. 使用 React.PureComponent&#xff0c;自动进行浅比较 Render Props1. 使用 Children props&#xff08;通过组件标签体传入结构&…

java虚拟机栈帧操作

虚拟机栈(Virtual Machine Stack)是虚拟机(如JVM、Python VM等)用来管理方法调用和执行的栈结构。它主要用于存储方法调用的相关信息,包括局部变量、操作数栈、动态链接和方法返回地址等。 java虚拟机栈操作的基本元素就是栈帧,栈帧主要包含了局部变量表、操作数栈、动态…