QT Creator上位机学习(四)多线程操作

news2024/11/19 5:34:50

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 多线程操作
  • 多线程创建
    • 基本概念
    • 接口函数
    • 线程类的定义实例
  • 线程同步
    • 基础互斥量的线程同步
    • 基于QReadWriteLock的线程同步
    • 基于QWaitCondition的线程同步
    • 基于信号量的线程同步
  • 总结


前言

由于目前时间比较赶,同时还在学习FreeRTOS,可能没有很多时间详细学习Qt了,所以结合需要编写的上位机,先暂时跳过一些基础知识,挑一些重要的知识点先学会,其他的之后用到了再一边学一边补充吧。


多线程操作

为了防止某些操作消耗时间较长,导致其他程序无法响应,所以出现了多线程操作,需要处理好同步和数据交互。

多线程运行方式:
1.Qt的主线程是窗口线程:负责窗口事件的处理和窗口控件的更新
2.子线程(工作线程)负责后台的业务逻辑,不能对窗口对象操作
3.他们之间一般使用信号与槽完成数据的传递,当然也有一些其他的同步方式

一般Qt的多线程操作用的是QThread类。
线程之间同步:QMutex、QMutexLocker、QReadWritelock、QwaitCondition、Qsemaphore。
使用Qt Concurrent实现的多线程可以自动根据处理器内核个数调整线程个数,而且不用考虑对共享数据的保护问题。

多线程创建

网上搜索有很多的创建方式,我先总结一下利用QThread类的方式创建。

基本概念

一个QThread管理一个线程,一般我们自定义一个继承QThread的类,重定义虚函数run(),该函数里需要完成的线程任务。
一般在主线程创建线程,调用start()开始执行任务,其内部会自动调用run() ,开始任务循环执行。
在run() 函数里调用exit()或quit()结束线程,或在主线程调用terminate() 强制结束线程。

接口函数

//公共函数:
bool isFinished()     //线程是否结束
bool isRunning()      //线程是否运行
Priority priority()   //返回线程优先级
void setPriority(Priority priority)  //设置线程优先级
void exit(int returnCode=0)          //退出线程的事件循环,退出码为returnCode,0成功,否则出错
bool wait(unsigned long time)        //阻止线程执行,使之等待time毫秒(之后继续运行或者结束)

//公共槽函数
void quit()     //退出线程,返回代码0,等效exit(0)
void start(Priority priority)  //其内部调用run() 开始线程,操作系统根据priority调度
void terminate()            //终止线程运行,但不是立刻结束,而是等待操作系统结束,之后应该加上wait()

//信号
void finished()   //在线程结束时发射此信号
void start()    //在线程开始的时候执行,run()函数被调用之前发射此信号

//静态公共成员
int idealThreadCount()    //返回系统上能运行线程的理想个数
void msleep(unsigned long msecs)   //强制休眠msecs毫秒
void sleep(unsigned long secs)     //强制休眠secs秒
void usleep(unsigned long usecs)   //强制休眠usecs微秒

//保护函数
virtual void run()   //run() 被调用开始线程任务的执行,所以在run()里面实现线程的任务
int exec()            //有run()函数调用,进入线程的事件循环,等待exit()退出

线程类的定义实例

头文件实例:

#include  <Qthread>
class QDiceThread : public Qthread
{
	o_OBJECT
private :  //仅类内函数可以访问(继承也不行)
	int m_seq=0 ;//掷骰子次数序号
	int m_dicevalue;//骰子点数
	bool m_Paused=true;//暂停
	bool m_stop=false;//停止
protected:   //类内及继承可以访问
	void run() o_DECL_OVERRIDE;//线程任务,需要重定义
public:   //所有都能访问
	QDiceThread () ;
	void diceBegin () ; //掷一次骰子
	void dicePause () ;//暂停
	void stopThread ( ) ;//结束线程
signals :
	void newvalue(int seq,int dicevalue) ; //产生新点数
};

之后正常定义好线程的各部分函数,在主线程中启动等操作,或者控件中启动。

在窗口关闭时我们要确保所有的线程停止:

void Dialog : : closeEvent (QcloseEvent *event)
{ 
//窗口关闭事件,必须结束线程
if (threadA. isRunning())
{
	threadA.stopThread();
	threadA. wait();
}
	event->accept() ;  //关闭窗口,ignore()不关闭
}

重定义run():

void QDiceThread: : run()
{//线程任务
	m_stop=false;//启动线程时令m_stop=false
	m_seq=0 ; //掷骰子次数
	qsrand (Qtime::currentTime().msec());//随机数初始化,qsrand是线程安全的
	while (!m stop)//循环主体
	{
		if (!m_Paused)
		{
			m_dicevalue=qrand ( ); //获取随机数
			m_dicevalue=(m_dicevalue % 6)+1;
			m_seq++;
			emit newvalue(m_seq,m_dicevalue);//发射信号
			msleep (500) ; //线程休眠500ms
	} 
	quit( );//相当于exit (o),退出线程的事件循环
}

主要是通过信号与槽机制实现的,这里主线程会等待工作线程的信号通知,所以不涉及到线程之间变量同时读写的问题。

线程同步

如果不使用信号与槽机制,由于线程之间可能要同时访问一个变量,如果这个变量正在写入的时候读取,就会出现错误。因此出现了几种方法:

基础互斥量的线程同步

QMutex和QMutexLocker的类,创建互斥量,对它进行lock(),unlock(),tryLock(),在写入读出的时候,进行锁定,读写完成的时候解锁。
在这里插入图片描述
在这里插入图片描述

有些函数虽然涉及到变量的读写,但是如果只有一条语句,相当原子语句,不需要锁定保护

QMutexLocker简化了一些,接收一个互斥量进行构建并锁定,只有在其生命周期结束的时候才会解锁。

基于QReadWriteLock的线程同步

很明显,上面的方法,当同时有多个线程读取的时候,是不需要锁定的。
在这里插入图片描述

基于QWaitCondition的线程同步

前面为了避免同时访问资源时发生冲突。在一个线程解锁资源后,不能及时通知其他线程。

在这里插入图片描述

基于信号量的线程同步

在这里插入图片描述

总结

先简单了解一下,之后用到什么再补充吧

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

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

相关文章

ModaHub 魔搭社区:火山方舟是如何解决大模型互信问题的

火山方舟是一个全面的大模型服务平台&#xff0c;通过整合多个大模型公司的产品&#xff0c;为需要大模型的企业提供联系和选择的机会。它不仅提供相关工具和服务&#xff0c;还构建了大模型"安全互信计算架构"&#xff0c;解决了大模型互信的问题。 这个安全互信计算…

【ArcGIS微课1000例】0069:用ArcGIS提取一条线的高程值

本实验讲解用ArcGIS软件,基于数字高程模型DEM提取一条线的高程值并导出。 文章目录 一、加载实验数据二、将线转为折点三、提取折点高程值四、导出高程值五、注意事项【相关阅读】:【GlobalMapper精品教程】060:用dem提取一条线的高程值 一、加载实验数据 本实验使用的数据…

AI创作与游戏开发(三)世界观设计

本文将从实践出发&#xff0c;全方位的在美术&#xff0c;程序&#xff0c;策划, 音乐方面使用AIGC进行游戏开发的辅助创作&#xff0c;来探索AI的上限。 写在前面 不管AI发展到什么地步&#xff0c;要记住一点的是。它只是工具&#xff0c;还是要以我为主&#xff0c;为我所…

Lake Shore475高斯计使用教程

475高斯计具有双排20字符真空荧光显示屏。在正常操作下&#xff0c;显示屏用来显示磁场读数和功能&#xff08;最大、最小值、相对读数等&#xff09;信息。另外也可以被配置为显示被测磁场温度和频率等信息。当设置高斯计参数或功能时&#xff0c;屏幕会显示操作提示和反馈信息…

华为云Could not connect to ‘121.37.92.110‘ (port 22): Connection failed.

今天在使用xshell连接服务器的时候&#xff0c;一直报错&#xff0c;爆的心态都炸了&#xff1a; 在输入主机和密码都正确的情况下&#xff0c;还是连接不上服务器&#xff1a; 后来经过长时间摸索&#xff0c;发现xshell软件要通过镜像系统来操作&#xff0c;而自己买的服务器…

走进人工智能|自动驾驶 迈向无人驾驶未来

前言&#xff1a; 自动驾驶是一种技术&#xff0c;通过使用传感器、人工智能和算法来使车辆能够在不需要人类干预的情况下自主地感知、决策和操作。 文章目录 序言背景核心技术支持传感器技术人工智能与机器学习 迈向无人驾驶未来目前形式领跑人困境和挑战 总结 本篇带你走进自…

【Mysql】X-DOC:Mysql数据库大量数据查询加速(定时JOB和存储过程应用案例)

X-DOC&#xff1a;Mysql数据库大量数据查询加速&#xff08;定时JOB和存储过程应用案例&#xff09; 1、案例背景2、解决思路3、实现方式3.1 开启定时调度功能3.2 创建JOB日志表3.3 创建JOB任务3.4 创建JOB3.5 JOB的维护及查看 4、总结 1、案例背景 在某中台系统中&#xff0c…

基于HTML5的手术室信息管理系统的设计与实现(源码+文档+数据库)

本文通过对现有手术室信息管理系统分析&#xff0c;设计了一套基于 HTML的手术室信息管理系统&#xff0c;实现了患者信息、手术记录及术后随访等功能&#xff0c;提高了手术室工作效率。 本系统实现了患者基本资料的录入及基本信息的查询&#xff0c;提供了术前准备情况及术中…

Android Studio 下载安装教程

在我们下载前&#xff0c;先来了解一下Android的4大组件&#xff1a; 1.活动 2.服务&#xff1a;类似线程&#xff0c;听歌时跳转发信息&#xff0c;后台进行播放音乐&#xff0c;前台交互&#xff0c;后台运行任务 3.广播接收者&#xff1a;【例1】感知充电线充电进度&#xf…

【Spring Boot统一功能处理】统一异常处理,统一的返回格式,@ControllerAdvice简单分析,即将走进SSM项目的大门! ! !

前言: 大家好,我是良辰丫,在上一篇文章中我们已经学习了一些统一功能处理的相关知识,今天我们继续深入学习这些知识,主要学习统一异常处理,统一的返回格式,ControllerAdvice简单分析.&#x1f48c;&#x1f48c;&#x1f48c; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &am…

邀请功能的实现分析

邀请功能 功能分析 场景&#xff1a;项目中出现用户邀请其他用户加入群组的功能 需求&#xff1a;用户点击生成邀请链接可以生成一个url&#xff0c;将这个url分享给其他用户&#xff0c;其他用户点击后对用户登录状态进行校验&#xff0c;校验通过即可加入群组&#xff0c;…

【dubbo triple provider 底层流转】

一、maven依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-codec-http2</artifactId><version>4.1.90.Final</version> </dependency><dependency><groupId>org.apache.dubbo</groupId>&l…

vue3 父子组件传值 记录

最近这个组件之间传值用的较多&#xff0c;我这该死的记性&#xff0c;总给忘记写法&#xff0c;特此记录下 第一种 父传子 补充&#xff1a;LeftView.vue 是父组件&#xff1b; Video.vue 是子组件 第二种 子传父 Video.vue 子组件 第一步 引入&#xff1a; import { de…

Linux搭建Discuz论坛

环境&#xff1a;redhat 9 mysql 8 Discuz 3.5 题目要求&#xff1a;在 bbs.example.com 主机上创建 Discuz 论坛&#xff0c;数据库服务器使用 db.example.com 主机的 bbs 数据库实例&#xff0c;该实例由 MySQL数据库软件提供服务。 题目要求没有说是在一台虚拟机…

PostgreSQL学习笔记

目录 一、PostgreSQL安装 1、下载 2、安装 二、PostgreSQL操作 1、数据库操作 2、表操作 3、数据操作 一、PostgreSQL安装 本章节以windows系统安装为例&#xff0c;讲解PostgreSQL 15.0的安装过程。 1、下载 访问PostgreSQL官方网站&#xff0c;下载对应的安装包&am…

Qt/C++编写超精美自定义控件(历时9年更新迭代/超202个控件/祖传原创)

一、前言 无论是哪一门开发框架&#xff0c;如果涉及到UI这块&#xff0c;肯定需要用到自定义控件&#xff0c;越复杂功能越多的项目&#xff0c;自定义控件的数量就越多&#xff0c;最开始的时候可能每个自定义控件都针对特定的应用场景&#xff0c;甚至里面带了特定的场景的…

多元回归预测 | Matlab基于麻雀算法(SSA)优化混合核极限学习机HKELM回归预测, SSA-HKELM数据回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于麻雀算法(SSA)优化混合核极限学习机HKELM回归预测, SSA-HKELM数据回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 …

Idea中使用Git详细教学

目录 一、配置 Git 二、创建项目远程仓库 三、初始化本地仓库 方法一&#xff1a; 方法二&#xff1a; 四、连接远程仓库 五、提交与拉取到本地仓库 六、推送到远程仓库 七、克隆远程仓库到本地 方法一&#xff1a; 方法二&#xff1a; 八、Git分支操作 一、配置 G…

GAMES101笔记 Lecture07 Shading1(Illumination, Shading and Graphics Pipeline)

目录 Visibility / Occlusion(可见性 or 遮挡)Painters Algorithm(画家算法)Z-Buffer(深度缓冲算法) Shading(着色)A Simple Shading Model(Blinn-Phong Reflectance Model)一个简单的着色模型&#xff1a;Blinn-Phong反射模型Diffuse Reflection(漫反射) 参考资源 Visibility …

Learn Mongodb了解DB数据库 ①

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; PHP MYSQL &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…