Qt系统相关——QThread

文章目录

    • QThread的API
    • 使用示例
    • 客户端多线程应用场景
    • 互斥锁
      • QMutex
      • QMutexLocker
      • QReadWriteLocker、QReadLocker、QWriteLocker
    • 条件变量和信号量

QThread的API

Qt中的多线程和Linux中的线程,本质上是一个东西

Linux线程概念

Linux多线程——线程控制

Linux多线程——互斥锁

Linux多线程——生产消费者模型

QThread:

  • 要创建线程,需要创建这个类的实例
  • 创建线程时,需指明线程入口函数
  • 创建QThread的子类,重写了其中的run方法,起到指定入口函数的方式(多态)

Tips:

这种方式在C++中并不常见,相比之下std::thread直接指定回调方式更常见

因为C++比较追求性能,多态机制可能导致运行时的额外开销(查询函数表,找到对应执行函数再执行)

但是对应客户端开发,对性能的要求,并没有那么的高

API说明
run()线程入口函数
start()通过运行run()开始执行线程
(该操作是真正调用系统API创建线程)
currentThread()获取当前线程的指针
isRunning()如果线程正在运行返回true,否则返回false
sleep()、msleep()、usleep()线程休眠,单位秒/毫秒/微妙
wait()线程阻塞,功能和pthread_join类似
terminate()终止线程执行。
线程可以立即终止,也可以不终止,取决于操作系统的调用
finished()线程结束发出的信号,可通过该信号实现线程的清理工作

使用示例

基于定时器的倒计时程序

创建QThread子类:

image-20240923211212409

thread.h

#ifndef THREAD_H
#define THREAD_H#include <QWidget>
#include<QThread>
class Thread : public QThread
{Q_OBJECT
public:Thread();//重写父类run方法void run();
signals://只需写函数声明, 定义Qt自动生成void notify();
};#endif // THREAD_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include"thread.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void handle();private:Ui::Widget *ui;Thread thread;
};
#endif // WIDGET_H

thread.cpp

#include "thread.h"Thread::Thread()
{}void Thread::run()
{//针对时间进行计时,每过一秒,通过信号槽通知主线程更新界面for(int i = 0; i < 10; i++){sleep(1);//发生信息emit notify();}
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//连接信号槽connect(&thread, &Thread::notify, this, &Widget::handle);//启动线程thread.start();
}Widget::~Widget()
{delete ui;
}void Widget::handle()
{int value = ui->lcdNumber->intValue();value--;ui->lcdNumber->display(value);
}

如果多个线程同时对界面进行修改,就会导致界面出错。

Qt直接一刀切,针对控件的任何修改,都在主线程中执行。

运行示意图:

image-20240923212827943

客户端多线程应用场景

在服务器开发的角度,多线程主要是充分利用多核CPU的计算资源,达到更高的效率。

而对于客户端,对效率要求并不是特别高,如果追求效率,把CPU计算资源吃完,会导致系统卡顿,这用户体验是很差的。

在客户端中,多线程主要是用于一些耗时的等待IO的操作,避免主线程卡死。

比如说客户端向服务端上传/下载较大的文件

这种密集的IO操作会使程序被系统阻塞挂起,一旦进程被挂起了,此时用户的操作就无法响应了。

因此使用单独的线程来处理这种密集的IO操作,就算挂起,也是挂起的这个线程,并不会影响主线程。

互斥锁

QMutex

谈到线程,必定绕不开线程安全问题,最通用的手段就是加锁,QMutex类就是Qt封装的互斥锁。

image-20240923215302391

上面这种情况就是线程安全问题,采取加锁,让线程串行执行

锁也是公共区的,只有一把锁

image-20240923215537861

QMutexLocker

C++11引入了std::lock_guard,智能锁RAII机制,这样能避免抛出异常或者忘记释放锁导致的问题。

Qt参考过来了,叫做QMutexLocker

image-20240923220111369

Tips:

Qt的锁和C++的锁,本质上都是封装系统提供的锁

虽然可以用C++的锁锁住Qt的线程,但是不建议。

QReadWriteLocker、QReadLocker、QWriteLocker

  • QReadWriteLocker读写锁,用于控制读和写的并发访问
  • QReadLocker用于读操作上锁,允许多个线程共享资源
  • QWriteLocker用于写操作上锁,一次允许一个线程写数据

条件变量和信号量

Qt当中的条件变量和信号量,与Linux当中的概念一模一样,只不过是接口不一样而已。

多个线程的调度是无序的,为了一定程度干预执行顺序,引入条件变量。

QWaitCondition

  • wait等待
  • wake唤醒
  • wakeAll唤醒全部

QSemaphore

  • acquire获取信号量
  • release释放信号量

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

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

相关文章

高效驱动,掌控动力:TB67H400AFNG 马达驱动器

在如今智能设备和自动化应用领域中&#xff0c;驱动器的性能直接决定了系统的可靠性与效率。东芝的TB67H400AFNG有刷直流马达驱动器凭借其卓越的性能&#xff0c;成为众多行业解决方案中的关键部件。无论是工业控制、自动化设备还是消费类电子产品&#xff0c;TB67H400AFNG都能…

【ARM】A64指令介绍及内存屏障和寄存器

A64指令集介绍 ISA : Instruction System Architecture 指令集总结 跳转指令 使用跳转指令直接跳转&#xff0c;跳转指令有跳转指令B&#xff0c;带链接的跳转指令BL &#xff0c;带状态切换的跳转指令BX。 B 跳转指令&#xff0c;跳转到指定的地址执行程序。 BL 带链接的跳…

stable diffusion 神经网络插件 controlnet 的安装,很详细

stable diffusion 神经网络插件 controlnet 的安装&#xff0c;很详细 一、前言二、下载1、方式一2、方式二 三、下载模型 一、前言 学到 stable diffusion 的 controlnet 插件&#xff0c;安装也略微曲折&#xff0c;这里做个记录。 下载前保证 github 能正常访问。 二、下…

css实现自定义静态进度条-vue2

实现如图所示 html&#xff1a; <div class"progress-container"><div class"progress-box left" :style"leftStyle"><div class"progress-value-top left">总中标电量</div><div class"progress-val…

在IntelliJ IDEA中设置文件自动定位

当然&#xff0c;以下是一个整理成博客格式的内容&#xff0c;关于如何在IntelliJ IDEA中设置文件自动定位功能。 在IntelliJ IDEA中设置文件自动定位 背景 最近由于公司项目开发的需求&#xff0c;我从VSCode转到了IntelliJ IDEA。虽然IDEA提供了许多强大的功能&#xff0c;…

mysql相关知识

查询一条sql语句的流程 连接器:建立连接&#xff0c;管理连接、校验用户身份查询缓存:查询语句如果命中查询缓存则直接返回&#xff0c;否则继续往下执行&#xff08;MSQL8.0 已删除&#xff09;解析 SQL&#xff1a;通过解析器对 SQL 查询语句进行词法分析、语法分析&#xf…

SQL进阶技巧:如何利用if语句简化where或join中的条件 | if条件语句的优雅使用方法

目录 0 问题场景 1 数据准备 2 问题分析 2.1 需求一 2.2需求二 3 小结 想要进一步了解SQL这门艺术语言的&#xff0c;可以订阅我的专栏数字化建设通关指南&#xff0c;将在该专栏进行详细解析。 专栏 原价99&#xff0c;现在活动价39.9&#xff0c;按照阶梯式增长&…

【LeetCode:1014. 最佳观光组合 + 思维题】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

解决启动docker desktop报The network name cannot be found的问题

现象 deploying WSL2 distributions ensuring main distro is deployed: checking if main distro is up to date: checking main distro bootstrap version: getting main distro bootstrap version: open \wsl$\docker-desktop\etc\wsl_bootstrap_version: The network name…

AP配置(leaderAP组网模式)

1.前言 由于业务需求&#xff0c;临时组建一个网络环境使用 网络设备&#xff1a;华为 AirEngine 5762-10、5762S-12 2.网络结构 参考文档&#xff0c;使用leader ap组网模式 使用一台5862S-12作为leaderAP&#xff0c;AP通电后默认是fit模式&#xff0c;需要进入修改 如果…

【html】基础(一)

本专栏内容为&#xff1a;前端专栏 记录学习前端&#xff0c;分为若干个子专栏&#xff0c;html js css vue等 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;js专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &am…

保障电气安全的电气火灾监控系统主要组成有哪些?

电气火灾是什么&#xff1f; 电气火灾一般是指由于电气线路、用电设备、器具以及供配电设备出现故障性释放的热能&#xff1a;如高温、电弧、电火花以及非故障性释放的能量&#xff1b;如电热器具的炽热表面&#xff0c;在具备燃烧条件下引燃本体或其他可燃物而造成的火灾&…

vue项目中——如何用echarts实现动态水球图

有时候UI的脑洞真的很大&#xff0c;总是设计出一些稀奇古怪的图形&#xff0c;但又不得不佩服他们的审美&#xff0c;确实还挺好看的。今天给大家介绍echarts如何实现动态水球图。如图所示&#xff1a; 实现步骤 一、引入 在vue页面中引入echarts&#xff0c;如未安装需要先…

【计算机网络强化】计网强化笔记

第一章 计算机网络体系结构 1.1 计算机网络概述 1.计算机网络由若干个节点和连接这些节点的链路组成 2. 3.计算机网络的组成 ①硬件、软件、协议 ②边缘部分和核心部分 ③通信子网和资源子网 4.电路交换、报文交换和分组交换 ①电路交换 分为三步&#xff1a;建立连接、…

AI赋能千人千面营销:从数据采集到精准用户画像的全流程解析

随着数字化时代的来临&#xff0c;企业的营销策略正从“广撒网”的大众营销&#xff0c;向“千人千面”的个性化营销转变。借助AI&#xff08;人工智能&#xff09;技术&#xff0c;企业可以通过分析大量用户数据&#xff0c;深入洞察每一个用户的独特需求和行为&#xff0c;进…

机器翻译之多头注意力(MultiAttentionn)在Seq2Seq的应用

目录 1.多头注意力&#xff08;MultiAttentionn&#xff09;的理念图 2.代码实现 2.1创建多头注意力函数 2.2验证上述封装的代码 2.3 创建 添加了Bahdanau的decoder 2.4训练 2.5预测 3.知识点个人理解 1.多头注意力&#xff08;MultiAttentionn&#xff09;的理念图…

OpenCV_距离变换的图像分割和Watershed算法详解

在学习watershed算法的时候&#xff0c;书写代码总会出现一些错误&#xff1a; 上述代码运行报错&#xff0c;显示OpenCV(4.10.0) Error: Assertion failed (src.type() CV_8UC3 && dst.type() CV_32SC1) in cv::watershed 查找资料&#xff1a;目前已解决 这个错…

在Windows系统上安装的 Arrow C++ 库

在Windows系统上安装的 Arrow C 库 正文第一步第二步第三步第四步注: 检查是否安装成功 吐槽 正文 第一步 git clone gitgithub.com:apache/arrow.git第二步 打开powershell (好像cmd也可以,不过我试了powershell中不报错,cmd中报错,不是很清楚为什么) 打开arrow的目录 cd …

java项目之基于springboot框架开发的景区民宿预约系统的设计与实现(源码+文档)

项目简介 基于springboot框架开发的景区民宿预约系统的设计与实现的主要使用者分为&#xff1a; 管理员的功能有&#xff1a;用户信息的查询管理&#xff0c;可以删除用户信息、修改用户信息、新增用户信息&#xff0c;根据公告信息进行新增、修改、查询操作等等。。 &#x1…

EasyExcel将数据库里面的数据生成excel文件

EasyExcel官方文档 1.在model模块导入依赖 <!-- 生成报表--> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.3</version> </dependency> 2.修饰实体类 package…