QT 异步编程之多线程
一、概述
1、在进行桌面应用程序开发的时候,假设应用程序在某些情况下需要处理比较复制的逻辑,如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事件,其它线程进行逻辑运算,多个线程各司其职,不仅可以提高用户体验还可以提升程序的执行效率。
2、当前的主线程不能让它做非常复制的逻辑操作,如果你让它做了非常复杂的逻辑操作后,咱们再操作这个窗口的时候就会出现界面的卡顿,那么这些复杂的操作应该交给子线程去做。
3、默认的线程在Qt中称之为窗口线程,也叫主线程,负责窗口事件处理或者窗口控件数据的更新。
4、子线程复制后台的业务逻辑处理,子线程中不能对窗口对象做任何操作,这些事情需要交给窗口线程处理。
5、主线程和子线程之间如果要进行数据的传递,需要使用Qt中的信号与槽机制
二、多线程的使用方式一
1、需要创建一个线程的子类,让其继承QT中的线程类QThread
class MyThread : public QThread
{...............
}
2、重写父类的run方法,在该函数内部编写子线程要处理的具体的业务流程
class MyThread : public QThread
{.........
protected:void run(){........}
}
3、在主线程中创建子线程对象,new一个就可以了
MyThread *subThread = new MyThread;
4、启动子线程,调用start()方法
subThread->start();
5、示例 MyThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H#include <QObject>
#include <QThread>class MyThread : public QThread
{Q_OBJECT
public:MyThread();void print();protected:void run() override;signals:
};#endif // MYTHREAD_H
6、 示例 MyThread.cpp
#include "mythread.h"
#include <QDebug>MyThread::MyThread()
{
}void MyThread::print()
{qDebug() << "子线程成员函数的线程ID:" << QThread::currentThreadId();
}void MyThread::run()
{qDebug() << "子线程的线程ID:" << QThread::currentThreadId();
}
7、main函数
int main(int argc, char *argv[])
{QApplication a(argc, argv);MyThread w;w.start();qDebug() << "主线程ID:" << QThread::currentThreadId();w.print();return a.exec();
}
8、结果展示
9、结果分析:
(1)主线程和子线程的顺序不确定,偶尔主线程在前,偶尔子线程在前
(2)子线程类的成员函数包括槽函数是运行在主线程当中的,只有run()函数运行在子线程中
(3)如果run()函数中调用子线程的成员函数,那么该成员函数运行在子线程中
二、多线程的使用方式二
1、创建一个新的类,让这个类从QObject派生
class MyWork : public QObject
{.........
}
2、在这个类中添加一个公共的成员函数,函数体就是我们要子线程中要执行的业务逻辑
class MyWork : public QObject
{
public:......//函数名自己指定,叫什么都可以void working();
}
3、在主线程中创建一个QThread对象,这就是子线程的对象
QThread *sub = new QThread;
4、在主线程中创建工作的类对象(不要给创建的对象指定父对象)
MyWork *work = new MyWork(this); //error
MyWork *work = new MyWork; //ok
5、将MyWork对象移动到创建的子线程对象中,需要调用QObject类提供的moveToThread()方法
work->moveToThread(sub);
6、启动子线程,调用start(),这时候线程启动了,但是移动到线程中的对象并没有工作
7、调用MyWork类对象的工作函数,让这个函数开始执行,这时候是在移动到的那个子线程中运行的
8、示例 MyWork.h
#ifndef MYWORK_H
#define MYWORK_H#include <QObject>class MyWork : public QObject
{Q_OBJECT
public:explicit MyWork(QObject *parent = nullptr);void print();public slots:void doWork();signals:
};#endif // MYWORK_H
9、示例 MyWork.cpp
#include "mywork.h"
#include <QDebug>
#include <QThread>MyWork::MyWork(QObject *parent): QObject{parent}
{
}void MyWork::print()
{qDebug() << "成员函数ThreadID:" << QThread::currentThreadId();
}void MyWork::doWork()
{qDebug() << "doWork ThreadId:" << QThread::currentThreadId();
}
10、示例 main
int main(int argc, char *argv[])
{QApplication a(argc, argv);QThread *thread = new QThread();MyWork *worker = new MyWork;worker->moveToThread(thread);QObject::connect(thread, &QThread::started, worker, &MyWork::doWork);QObject::connect(thread, &QThread::started, worker, &MyWork::print);qDebug() << "主线程ID:" << QThread::currentThreadId();//启动线程thread->start();//调用成员函数worker->print();return a.exec();
}
11、运行结果
22:38:21: Starting D:\QT\practice\mouseTrack\bin\debug\untitled.exe...
主线程ID: 0x56f0
成员函数ThreadID: 0x56f0
doWork ThreadId: 0x49d4
成员函数ThreadID: 0x49d4
12、结果分析
(1)通过信号与槽触发的成员函数、槽函数,执行都在新线程里面,通过对象调用执行,则在旧线程里面
三、两种方式的使用场景
1、QThread使用场景
(1)当需要创建一个独立的线程来执行某个任务,且需要对线程的整个生命周期进行管理时,适合使用 QThread 方式。
(2)当任务逻辑相对简单或独立,不需要频繁地进行线程间通信时,可以选择使用 QThread 方式。
2、moveToThread方式
(1)当需要将一个 QObject 对象移动到指定的线程中执行任务,或者需要多个对象在同一线程中协同工作时,适合使用 moveToThread() 方式。
(2)当需要灵活地控制对象和线程之间的关系,进行复杂的线程间通信时,可以选择使用 moveToThread() 方式。
相关文章:
QT 异步编程之多线程
一、概述 1、在进行桌面应用程序开发的时候,假设应用程序在某些情况下需要处理比较复制的逻辑,如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事…...
HCIA项目实践---OSPF的知识和原理总结
9.5 OSPF 9.5.1 从哪些角度评判一个动态路由协议的好坏? (1)选路佳(是否会出环) OSPF 协议采用链路状态算法,通过收集网络拓扑信息来计算最短路径,从根本上避免了路由环路的产生。 (…...
DNS污染:网络世界的“隐形劫持”与防御
在互联网的底层架构中,DNS(域名系统)如同数字世界的“导航员”,将用户输入的域名翻译成机器可读的IP地址。然而,DNS污染(DNS Poisoning)正像一场无声的“地址篡改”危机,威胁着全球网…...
Unity Shader Feature
Shader Feature 设置Keyword //0:Red 1:Green 2:Blue Mat.SetInt(“_Color”,0); 需要在创建时进行设置,运行时不可设置 Shader "Unlit/KeywordEnum" {Properties{[KeywordEnum(Red,Green,Blue)] _Color("Color",int) 0}SubShader{Pass{HLSL…...
Java-数据结构-栈与队列(常考面试题与单调栈)
在上一篇的学习中,我们学习了栈和队列的基本知识,以及它们对应都有哪些方法,在什么应用场景下如何使用,并且还对它们进行了模拟实现,而其实对于栈和队列的相关知识还远不止于此,而今天我们就对栈与队列进行…...
Python Pandas(11):Pandas 数据可视化
数据可视化是数据分析中的重要环节,它帮助我们更好地理解和解释数据的模式、趋势和关系。通过图形、图表等形式,数据可视化将复杂的数字和统计信息转化为易于理解的图像,从而便于做出决策。Pandas 提供了与 Matplotlib 和 Seaborn 等可视化库…...
wordpress模板文件结构超详解
wordpress网站建设中,主题的制作是最为核心的环节。了解模板文件结构是模板制作的第一步,本文所讲的模板文件结构包括两部分,一是指以文件名为概念的文件结构,二是指文件内容的代码结构。 一、如何使模板文件起作用 ↑ wordpres…...
大脑神经网络与机器神经网络的区别
大脑神经网络(生物神经网络)与机器神经网络(人工神经网络,ANN)虽然名称相似,但在结构、功能、学习机制等方面存在显著差异。以下是两者的主要区别: 1. 基础结构与组成 大脑神经网络: 由 生物神经元(约860亿个)通过突触连接形成动态网络。 神经元通过电化学信号(动作…...
【H5自适应】高端科技类pbootcms网站模板 – 三级栏目、下载与招聘功能支持
(H5自适应)高端大气的科技类pbootcms网站模板 带三级栏目、下载和招聘功能 后台地址:您的域名/admin.php 后台账号:admin 后台密码:123456 为了提升系统安全,请将后台文件admin.php的文件名修改一下。修改之后,后台…...
SQL-leetcode—1661. 每台机器的进程平均运行时间
1661. 每台机器的进程平均运行时间 表: Activity ----------------------- | Column Name | Type | ----------------------- | machine_id | int | | process_id | int | | activity_type | enum | | timestamp | float | ----------------------- 该表展示了一家工厂网站的…...
C++ Primer 跳转语句
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
清华大学:DeepSeek 如何赋能职场应用(35 页 PDF)
原来已经分享过清华大学的 DeepSeek:从入门到精通(100页PDF) 现在又来第二弹:《DeepSeek 如何赋能职场应用?从提示语技巧到多场景应用》 PDF里介绍了 DeepSeek 这一人工智能工具及其在职场中的应用,从基础…...
idea 错误: 找不到或无法加载主类 @C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448
idea 错误: 找不到或无法加载主类 C:\Users\admin\AppData\Local\Temp\idea_arg_file1549212448 该错误往往和左下角爱弹出的如下提示是一个意思 Error running ‘PayV3Test1.testTransferBatchesBatchId’ Error running PayV3Test1.testTransferBatchesBatchId. Command lin…...
开发指南098-logback-spring.xml说明
可执行的工程src\main\resources目录有logback-spring.xml文件用于配置日志。配置日志有些容易犯晕的地方,这里列出: 1、<logger>标签的优先级高于<root>标签:所以,如果<logger>标签指定了某个具体的包或类的…...
【SpringBoot3.x+】slf4j-log4j12依赖引入打印日志报错的两种解决方法
最开始引入了1.7.5版本的slf4j-log4j依赖包,但是控制台不报错也不显示日志 在https://mvnrepository.com/找到最新的2.0.16版本之后出现报错: 进入提示的slf4j网站中可以找到从2.0.0版本开始,slf4j-log4j已经被slf4j-reload4j取代࿱…...
【STM32】H743的以太网MAC控制器的一个特殊功能
调试743的MAC,翻阅手册的时候,发现了一个有意思的功能 混杂模式 H743的MAC控制器,可以设置为混杂模式,这就意味着它可以做一些网络监控的应用,譬如连接具备端口镜像功能的交换机,然后直接代替PC实现网络数据…...
Java LinkedList(单列集合)
LinkedList 是 Java 中实现了 List 接口的一个类,它属于 java.util 包。与 ArrayList 不同,LinkedList 是基于双向链表实现的,适合于频繁进行插入和删除操作的场景。 1. LinkedList 的基本特性 基于链表实现:LinkedList 使用双向…...
docker compose快速部署kafka-connect集群
先部署kafka集群,启动 参考:docker compose部署kafka集群-CSDN博客 创建timezone文件,内容填写Asia/Shanghai 再部署kafka-connect集群 networks: net: external: true services: kafka-connect1: restart: always image:…...
docker 部署nginx,nginx 504
遇到问题 原因: 因为用的docker 部署nginx, docker 应用与服务之间的端口未开放,导致访问不到服务。...
RealClip正式发布:重新定义轻量化数字内容交互体验
在移动互联网流量红利逐渐见顶的当下,用户对即时性、碎片化娱乐与交互体验的需求持续攀升。轻量化小游戏、VR互动、数字孪生、工业仿真等内容形态迅速崛起,但开发者却面临两大核心矛盾:如何将高性能互动内容轻量化嵌入现有应用中?…...
SQLMesh系列教程-2:SQLMesh入门项目实战(上篇)
假设你已经了解SQLMesh是什么,以及其他应用场景。如果没有,我建议你先阅读《SQLMesh系列教程-1:数据工程师的高效利器-SQLMesh》。 在本文中,我们将完成一个小项目或教程,以帮助你开始使用SQLMesh。你可以选择一步一步…...
把 DeepSeek1.5b 部署在显卡小于4G的电脑上
这里写自定义目录标题 介绍准备安装 Ollama查看CUDA需要版本安装CudaToolkit检查Cuda是否装好设置Ollama环境变量验证是否跑在GPU上ollama如何导入本地下载的模型安装及配置docker安装open-webui启动open-webui开始对话 调整gpu精度 介绍 Deepseek1.5b能够运行在只用cpu和gpu内…...
#渗透测试#批量漏洞挖掘#29网课交单平台 SQL注入
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 1. 漏洞原理 2. 漏洞定位 3. 攻击验证示…...
试试DeepSeek写prompt+stable diffusion生成漫画
#deepseek #stable diffusion 模型:dreamshaperXL_v21TurboDPMSDE.safetensors 一、情节拟定 漫画情节由deepseek自编自导,画幅为四张。 Prompt 1: 魔法觉醒 "一个平凡的少年在阁楼发现一本古老的魔法书,书页散发着微弱的蓝光。画…...
java面试题之 int和Integer的区别
int和Integer的区别 1、Integer是int的包装类,int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用,而int变量不需要 3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;…...
Spring Bean的生命周期
1、对象实例化 2、属性设置 3、初始化 4、使用 5、销毁 示例代码如下: import org.springframework.stereotype.Component;Component public class SpringBeanA {public SpringBeanA() {System.out.println("第一步:实例化(spring对象&#x…...
Vue 发送 PDF 文件链接到 WinForm 程序进行打印
Vue 发送 PDF 文件链接到 WinForm 程序进行打印的完整流程如下: 1. Vue 端 Vue 通过 fetch 或 axios 发送 PDF 文件的 URL 给 WinForms 程序(WinForms 需要开启一个本地 API)。 <template><div><button click"sendPri…...
Vue笔记(十)
一、AI的基本认知 二、ChatGPT的基本使用 三、AI插件--Copilot入门 1.Copilot是由OpenAI和GitHub合作开发的AI编程辅助插件,基于大量代码训练,能根据上下文自动生成代码建议。 2.安装与配置:在常用代码编辑器(如Visual Studio Cod…...
使用LangChainV3.0加载PDF文件并进行总结
LangChain目前已经更新到了V3版本,之前一直使用的V1版本,有很多方法都需要自己去封装,这次重新看了V3版本的API文档,很多方法都十分便利,调用方法简单明了十分方便,下面就来展示下这次对于PDF文件加载的优化…...
玩转大语言模型——使用Kiln AI可视化环境进行大语言模型微调数据合成
系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——三分钟教你用langchain提示词工程获得猫娘女友 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型—…...
EasyRTC智能硬件:小体积,大能量,开启音视频互动新体验
在万物互联的时代,智能硬件正以前所未有的速度融入我们的生活。然而,受限于硬件性能和网络环境,许多智能硬件在音视频互动体验上仍存在延迟高、卡顿、回声等问题,严重影响了用户的使用体验。 EasyRTC智能硬件,凭借其强…...
vue知识点5
1.如何让组件里的样式与其他组件互相不干扰 scope范围的意思 <style scope> </style> 2.vue的生命周期 创建 挂载 更新 销毁 3.vue的四个生命周期详解 创建beforeCreate,created 挂载 beforeMount,mounted 更新 beforeUpdate,updated 销毁 beforeDest…...
qt的QSizePolicy的使用
使用 QSizePolicy 设置控件的伸缩因子 在 Qt 中,QSizePolicy 控制 控件如何在布局中伸缩。如果想要影响控件的大小调整行为,可以通过 QSizePolicy::setHorizontalStretch() 和 QSizePolicy::setVerticalStretch() 设置伸缩因子。 基本用法 假设我们有一个…...
基于 FFmpeg 和 OpenGLES 的 iOS 视频预览和录制技术方案设计
基于 FFmpeg 和 OpenGLES 的 iOS 视频预览和录制技术方案设计 在 iOS 上实现一个基于 FFmpeg 和 OpenGLES 的视频预览和录制功能,需要结合 FFmpeg 的强大音视频处理能力和 OpenGLES 的高效图形渲染能力。以下是一个完整的技术方案设计,包含项目的架构设计、模块划分、技术选…...
如何保障 MySQL 和 Redis 的数据一致性
在现代分布式系统中,确保不同数据存储(如 MySQL 和 Redis)之间的一致性是一个常见的挑战。MySQL 是一种关系型数据库管理系统,而 Redis 是一种内存中的键值存储系统,通常用于缓存和快速访问数据。本文将详细介绍几种保…...
【LeetCode Hot100 子串】和为 k 的子数组、滑动窗口最大值、最小覆盖子串
子串 1. 和为 k 的子数组题目描述解题思路主要思路步骤 时间复杂度与空间复杂度代码实现 2. 滑动窗口最大值题目描述解题思路双端队列的原理:优化步骤: Java实现 3. 最小覆盖子串题目描述解题思路滑动窗口的基本思路:具体步骤:算法…...
【CLIP系列】4:目标检测(ViLD、GLIP)
目录 1 ViLD2 GLIP2.1 前言2.2 损失计算2.3 模型框架 1 ViLD OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION 从标题就能看出来,作者是把CLIP模型当成一个Teacher,去蒸馏他自己的网络,从而能Zero Shot去…...
vue-谷歌浏览器安装vue-devtools插件
文章目录 一、谷歌浏览器安装vue-devtools1.1、方式一:直接下载crx并安装 本文讲解谷歌浏览器安装vue-devtools插件的步骤。 注意:以下vue-devtools插件都是vue2版本的。 一、谷歌浏览器安装vue-devtools 1.1、方式一:直接下载crx并安装 …...
【安全测试】0基础新手学Web安全测试笔记(一)
文章目录 一、关于账号密码的漏洞二、关于验证码的漏洞三、Burp工具的使用四、渗透测试1. 渗透测试类型2. 脆弱性评估 五、常见的应用安全风险1. 注入2. 失效的身份认证3. 敏感数据泄露4. XML外部实体(XXE)5. 失效的访问控制6. 安全配置错误7. 跨站脚本:(XSS)8. 不安全的反序列…...
初窥强大,AI识别技术实现图像转文字(OCR技术)
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据、人工智能领域创作者。目前从事python全栈、爬虫和人工智能等相关工作,主要擅长领域有:python…...
JDK 14,15,17的一些新特性(部分常用)
1:instanceof(后,使用不再需要墙转) 2:switch语句增强 1:支持lmbda,自动防击穿,有返回值 2:支持case多个值,复杂逻辑结果支持yield返回 3:字符串…...
架构设计系列(二):CI/CD
一、概述 CI/CD 是 持续集成(Continuous Integration) 和 持续交付/持续部署(Continuous Delivery/Continuous Deployment) 的缩写,是现代软件开发中的一套核心实践和工具链,旨在提高软件交付的效率、质量…...
二十六、使用docsify搭建文档管理平台
特性 无需构建,写完文档直接发布容易使用并且轻量 (~19kB gzipped)智能的全文搜索提供多套主题丰富的 API...
SpringMVC学习使用
一、SpringMVC简单理解 1.1 Spring与Web环境集成 1.1.1 ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(sp…...
MySQL | MySQL安装教程
MySQL | MySQL安装教程(压缩包(ZIP)安装-详细版) 🪄个人博客:https://vite.xingji.fun MySQL概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,MySQL AB公司被Sun公司收购,Sun公…...
Vite入门指南
一、什么是Vite? Vite(法语意为"快速")是由Vue作者尤雨溪开发的新型前端构建工具。它基于原生ES模块(ESM)实现,具有以下核心优势: 极速启动:冷启动时间比Webpack快10-10…...
DeepSeek 助力 Vue 开发:打造丝滑的进度条
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
左移架构 -- 从攒批,湖仓到使用数据流的实时数据产品
编辑导读: 这篇文章翻译自 Kai Waehner的 《The Shift Left Architecture – From Batch and Lakehouse to Real-Time Data Products with Data Streaming》。文章通过数据产品的概念引出了如何创建可重复使用的数据产品使企业能够从当前和未来的数据中获得价值。基于构建数据产…...
用java实现word(docx)转换为pdf格式文档(简单版)
导入依赖 <dependency> <groupId>com.documents4j</groupId> <artifactId>documents4j-local</artifactId> <version>1.0.3</version> </dependency> <dependency>…...
【云安全】云原生- K8S etcd 未授权访问
什么是etcd? etcd 是一个开源的分布式键值存储系统,主要用于存储和管理配置信息、状态数据以及服务发现信息。它采用 Raft 共识算法,确保数据的一致性和高可用性,能够在多个节点上运行,保证在部分节点故障时仍能继续提…...