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.xdnf.cn/news/148230.html

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

相关文章

[干货] [非基础警告] Unity 发布-订阅模式下的事件中心设计

本文师承于唐老师&#xff0c;但是修改了一些代码&#xff0c;采用更加方便理解的方式设计 1.什么是事件中心 2.可以比喻成冒险者工会的任务板子 任务板子上面有发布任务和任务完成两种基础情况 2.1 发布任务 来个冒险者发布一个任务&#xff0c;就执行Pulishtask方法 这…

记一次 RabbitMQ 消费者莫名消失问题的排查

问题回顾 某天下午&#xff0c;生产监控告警&#xff1a;消息积压&#xff0c;队列 xxx 消息数超过 100&#xff1b;我第一时间想到的是应用服务是不是停了&#xff0c;但应用服务存活监控又没有告警&#xff0c;但我还是找值班运维同事帮忙确认了下&#xff0c;确认结果是服务…

GitHub上图像超分开源项目推荐【持续更新】

RAISR 介绍&#xff1a;RAISR&#xff08;Rapid and Accurate Image Super-Resolution&#xff09;是一种由Google开发的图像超分辨率技术&#xff0c;它利用机器学习算法来提高低分辨率图像的质量&#xff0c;使其看起来更加清晰和细致。这项技术可以在移动设备上实时运行&am…

uni-app快速入门

目录 一、什么是 uni-app二、快速创建 uni-app 项目1.创建 uni-app2.运行 uni-app 三、uni-app 相对传统 H5 的变化1.网络模型的变化2.文件类型变化3.文件内代码架构的变化4.外部文件引用方式变化5.组件/标签的变化6.js的变化&#xff08;1&#xff09;运行环境从浏览器变成v8引…

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

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

最新版Visual Studio安装教程(超详细,新手必看)

一、官网下载 这里奉上Visual Studio官方下载地址&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads/https://visualstudio.microsoft.com/zh-hans/downloads/ 对于我们学习来说&#xff0c;下载第一个社区免费版即可&#xff0c;点击下载。 下载完成以后是…

Conda虚拟环境配置常见问题记录

搞深度学习的&#xff0c;总有被虚拟环境搞得头大的时候&#xff0c;特别是涉及到CUDA&#xff0c;Torch &#xff0c;Torchvision 版本适配的问题。这两天因为在原来的环境中装了几个包&#xff0c;导致原来的环境崩了&#xff0c;搞了一天的时间又重新配了环境&#xff0c;中…

18 基于51单片机的心率体温监测报警系统(包括程序、仿真、原理图、流程图)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机 ds18B20读取温度&#xff0c; 设置初始心率65 设置温度阈值38 心率阈值60 100 如果超过阈值&#xff0c;蜂鸣器报警&#xff0c;led灯亮 二、硬件资源 基于KEIL5编写C代码&#xf…

BOE(京东方)重磅亮相世界制造业大会 科技创新引领现代化产业体系建设新未来

9月20日-23日&#xff0c;备受瞩目的2024世界制造业大会在合肥盛大召开&#xff0c;汇聚全球行业领袖、专家学者、知名企业&#xff0c;共同探讨现代化产业体系建设的新技术、新趋势、新机遇。作为积极推动实体经济与数字经济融合发展的产业领军企业&#xff0c;BOE&#xff08…

文件(打开关闭读写) C语言

一、文件 二、打开文件 关闭文件 FILE *fopen(const char *path, const char *mode); 功能: 打开文件&#xff0c;获得对应的流指针数&#xff1a; "r" 只读方式&#xff0c;文件必须存在&#xff0c;不存在则报错 "r" 读写方式&…

spring boot文件上传之x-file-storage

spring boot文件上传之x-file-storage 今天看到一个文件上传的开源组件x-file-storage&#xff0c;官方地址如下&#xff1a; https://x-file-storage.xuyanwu.cn/#/ 该组件官网是这样介绍的&#xff0c;如下&#xff1a; 一行代码将文件存储到本地、FTP、SFTP、WebDAV、阿…

kettle从入门到精通 第八十六课 ETL之kettle kettle调用https接口忽略SSL校验

1、在使用kettle调用接口的时候不可避免要调用http或者https接口&#xff0c;调用http接口kettle可以正常工作&#xff0c;但是遇到https接口的时候kettle就会提示证书有误&#xff0c;无法正常调用接口&#xff0c;今天咱们一起通过自研插件的方式来解决这个问题。自研插件需要…

简单的云存储靶场

搭建靶场 我这里使用tx云&#xff0c;请自行搭建 https://shuihui2211-1329809954.cos.ap-nanjing.myqcloud.com 复现 私有读写 访问权限为私有读写时&#xff0c;我们访问url则会出现如下提示 目录遍历 漏洞成因 将policy权限设置为所有操作时 复现 我这里上传了一…

YOLO V10简单使用

一.环境安装 1、下载官方源码 官方GitHub地址&#xff1a;https://github.com/THU-MIG/yolov10 点击跳转 2. 配置conda环境 在conda创建python3.9环境 conda create -n yolov10 python3.9激活切换到创建的python3.9环境 conda activate yolov103. 安装YOLOv10依赖 切换…

Algo-Lab 2 Stack Queue ADT

Lab 2: Stack & Queue ADT Part 1 ​ 这里只说一下最小栈的思路&#xff0c;我们可以在定义一个栈&#xff0c;来同步存储当前情况下的占的最小值。最小栈第一时间的想法可能是设定一个变量&#xff0c;每次push进来栈中的元素进行对比&#xff0c;保持最小值&#xff0c;…

每日一练:二叉树的直径

543. 二叉树的直径 - 力扣&#xff08;LeetCode&#xff09; 一、题目要求 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之…

2024.9.23 作业

统计家目录下.c文件的个数 定义一个稀疏数组(下标不连续)&#xff0c;写一个函数&#xff0c;求该稀疏数组的和&#xff0c;要求稀疏数组中的数值通过参数传递到函数中。 arr([2]9 [4]8 [30]23 [24]3 [21]7) 思维导图

高效高质量SCI论文撰写及投稿

第一章、论文写作准备即为最关键 1、科技论文写作前期的重要性及其分类 2、AI工具如何助力学术论文 3、研究主题确定及提高创新性 兴趣与背景&#xff1a;选择一个您感兴趣且有背景知识的研究领域。 创新性&#xff1a;选题和研究设计阶段如何提高学术创新性的方法。 研究缺…

【React】原理

笔记来源&#xff1a;小满zs 虚拟 DOM // react.js // jsx > babel | swc > React.createElement const React {createElement(type, props, ...children) {return {type,props: {...props,children: children.map(child > typeof child object ? child : React.cr…

3 pyqt5 Layout布局(保证主界面缩放各组件也对应缩放)== 主要有Qt Designer和完全代码设置两种设计方式(根据自己情况选择即可)

文章目录 前言一、Layout的类别二、使用Qt Designer进行Layout布局三、完全使用代码进行Layout布局前言 本节我们的http测试的例子,只实现界面方面的逻辑,底层不用管。我们主要的目的是通过这个例子设计界面布局。 我们前面写的界面程序有个问题,如果你用鼠标拖拽主窗口边…