QtConcurrent::run操作界面ui的注意事项(1)

先说结论:QtConcurrent::run启动的耗时处理函数,不允许处理ui界面对象,如控件,如进度条等等!

QtConcurrent::run非常好用,胜过QThead的两种方式(run和moveToThread),例如下面是非常直观和简单的使用方式:

QT += concurrent#include <QtConcurrent>
#include <QThread>void MainWindow::doSomeWork()//死循环操作,代替原有代码的函数功能
{int i=0;while(myEnable){i++;qDebug()<<i;QThread::msleep(10);}
}void MainWindow::myStart()//启动函数是需要在原有代码基础上增加
{myEnable=1;QtConcurrent::run(this,&MainWindow::doSomeWork);//多线程执行死循环启动,可以带参数void MainWindow::myExit()
{myEnable=0;//
}

但是,但是,上述的MainWindow::doSomeWork函数中不能访问ui对象,会引起程序崩溃!!原因后面解释。先说解决办法:

一种方法是,MainWindow::doSomeWork能读写简单类型的数值变量,int,float类型,则可以借助这些简单类型变量做个过渡中转一下。既然是ui界面对象,是给人看的,延时几十个ms,人的眼睛不会有感觉,因此,开一个定时器,轮询这些简单的数值int、float变量,在定时器里去更新ui界面对象,这是最简单的方法;

另一种方法是,在调用QtConcurrent::run(this,&MainWindow::doSomeWork)的地方,检查返回值,开一个循环等待完成。在循环里完成对界面ui的操作,如下面在按钮点击事件中:

void MainWindow::on_pushButton_clicked()
{ui->progressBar->setRange(0, 100); //使用进度条QFuture<void> future = QtConcurrent::run(this,&MainWindow::doSomeWork);//多线程执行死循环启动,可以带参数while(!future.isFinished()){ui->progressBar->setValue(m_curVal); //设置进度条当前值,m_curVal在doSomeWork中被更新QApplication::processEvents(QEventLoop::AllEvents, 100); //避免ui挂死}
}

上面依然是第一种方式的变种,只不过在循环里,借助了QApplication::processEvents(QEventLoop::AllEvents, 100),避免将ui挂死。

小结上述两种方法,第一种其实就是“共享全局变量”的变形;第二种是把循环直接写在ui的按钮事件里,让ui保持“灵活”;

再回到上述的:MainWindow::doSomeWork函数中不能访问ui对象,会引起程序崩溃!!

原因是,QtConcurrent::run本质是开启了另外一个子线程,该子线程和ui线程不相同,可以用:

qDebug()<<"当前线程 "<<QThread::currentThread();

分别加入到MainWindow的构造函数、on_pushButton_clicked()函数、doSomeWork()函数里验证,会发现,不在同一个线程里。这是qt的“跨线程”问题。

因为涉及到“跨线程”问题,总的来说,QtConcurrent::run并不好用,如果开启的线程里,要读写套接字tcp/udp、串口,是有问题的。

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

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

相关文章

拆炸弹(Lc1652)——模拟

你有一个炸弹需要拆除&#xff0c;时间紧迫&#xff01;你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。 为了获得正确的密码&#xff0c;你需要替换掉每一个数字。所有数字会 同时 被替换。 如果 k > 0 &#xff0c;将第 i 个数字用 接下来 k 个数字之…

ERP系统电子文件归档和电子档案管理规范

ERP系统电子文件归档和电子档案管理规范 1 范围 本文件描述了企业资源计划&#xff08;ERP&#xff09;系统形成电子文件归档和电子档案管理的方法。 本文件适用于企业资源计划&#xff08;ERP&#xff09;系统&#xff08;含采购、销售、物料、生产计划、质量、设备、项目…

使用C#和EF Core实现高效的SQL批量插入

在软件开发中&#xff0c;批量插入数据是一个常见的需求&#xff0c;特别是在数据迁移、初始化数据库或进行大量数据处理时。Entity Framework Core (EF Core) 是一个流行的.NET对象关系映射器&#xff08;ORM&#xff09;&#xff0c;它简化了数据库操作&#xff0c;但在进行大…

Linux CPU 飙升 排查五步法

排查思路-五步法 1. top命令定位应用进程pid 找到最耗时的CPU的进程pid top2. top-Hp[pid]定位应用进程对应的线程tid 找到最消耗CPU的线程ID // 执行 top -Hp [pid] 定位应用进程对应的线程 tid // 按shift p 组合键&#xff0c;按照CPU占用率排序 > top -Hp 111683.…

用wordpress建跨境电商独立站的5大优势

免费和开源 WordPress是一个免费的开源内容管理系统&#xff0c;用户可以自由下载、安装和使用&#xff0c;无需支付版权费用或订阅费用。开源特性也意味着用户可以根据自己的需求修改和定制代码&#xff0c;或者使用其他开发者提供的插件和主题来扩展和美化网站。 易用和灵活…

探索Vue 3.0中的v-html指令

探索Vue 3.0中的v-html指令 一、什么是v-html指令&#xff1f;1、 在Vue 3.0中使用v-html2、 注意事项 二、结语 一、什么是v-html指令&#xff1f; Vue.js作为一款流行的JavaScript框架&#xff0c;不断地演进着。随着Vue 3.0的发布&#xff0c;开发者们迎来了更加强大和灵活…

CMS清理流程及问题

CMS&#xff08;Concurrent Mark Sweep&#xff0c;并发标记清除&#xff09;收集器是以获取最短回收停顿时间为目标的收集器&#xff08;追求低停顿)&#xff0c;它在垃圾收集时使得用户线程和GC线程并发执行&#xff0c;因此在垃圾收集过程中用户也不会感到明显的卡顿。从名字…

SparkSQL编程入口和模型与SparkSQL基本编程

SparkSQL编程入口和模型 SparkSQL编程模型 主要通过两种方式操作SparkSQL&#xff0c;一种就是SQL&#xff0c;另一种为DataFrame和Dataset。 1)SQL&#xff1a;SQL不用多说&#xff0c;就和Hive操作一样&#xff0c;但是需要清楚一点的是&#xff0c;SQL操作的是表&#xf…

为什么很多人不推荐你用JWT?

为什么很多人不推荐你用JWT? 如果你经常看一些网上的带你做项目的教程&#xff0c;你就会发现 有很多的项目都用到了JWT。那么他到底安全吗&#xff1f;为什么那么多人不推荐你去使用。这个文章将会从全方面的带你了解JWT 以及他的优缺点。 什么是JWT? 这个是他的官网JSON…

Linux学习(一)-- 简单的认识

目录 1. Linux的诞生 2.Linux发行版 拓展&#xff1a; &#xff08;1&#xff09;什么是Linux系统的内核&#xff1f; &#xff08;2&#xff09;什么是Linux系统发行版&#xff1f; 1. Linux的诞生 Linux创始人: 林纳斯 托瓦兹 Linux 诞生于1991年&#xff0c;作者上大学…

2×24.5W、内置 DSP、低失真、高信噪比、I2S 输入 D 类音频功率放大器,完美替换TPA5805,晶豪,致盛,

ANT3825 是一款高集成度、高效率的双通道数字 输入功放。供电电压范围在 5V&#xff5e;18V&#xff0c;数字接口 电源支持 3.3V 或 1.8V。双通道 BTL 模式下输出 功率可以到 224.5W(4Ω&#xff0c;16V&#xff0c;THDN1%)&#xff0c; 单通道 PBTL 模式下可以输出 37W&#x…

Spring IoCDI(2)—IoC详解

目录 一、IoC详解 1、Bean的存储 &#xff08;1&#xff09;Controller&#xff08;控制器存储&#xff09; 获取bean对象的其他方式 Bean 命名约定 &#xff08;2&#xff09;Service&#xff08;服务存储&#xff09; &#xff08;3&#xff09;Repository&#xff08…

注册英国公司都有什么好处

注册英国公司是一项相对简单直接的程序&#xff0c;通常需要通过 Companies House&#xff08;英国公司注册局&#xff09;完成。以下是注册英国公司的步骤&#xff1a; 选择公司名称&#xff1a; 首先&#xff0c;您需要选择一个独特的公司名称。您可以通过Companies House的…

2分钟教你Flutter怎么避免引用内存泄漏

2分钟教你Flutter怎么避免引用内存泄漏 内存泄漏原因1. 在当前类&#xff0c;或者方法等移除改引用&#xff0c;让其他自动释放&#xff0c;等下一轮GC扫描释放。如2. 使用弱引用-----**WeakReference**&#xff0c;当前使用完&#xff0c;生命周期结束后&#xff0c;自动释放。…

VTK —— 三、图形格式 - 示例1 - 读取.vtp文件并输出.ply文件(附完整源码)

代码效果&#xff1a;演示程序读取.vtp后输出.ply文件&#xff0c;使用paraview打开该输出的.ply文件 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用V…

opencv图像处理详细讲

传统的计算机视觉框架&#xff1a; SimpleCV BoofCV Dlib JavaCV 深度学习计算机视觉框架 Caffe Tensorflow Pytorch Paddlepaddle Keras 深度视觉计算机视觉框架 OpenVINO TensorRT onnxruntime Deepface YOLO/DarkNet mmdetection Paddle-detection/seg/ocr …

重识来伊份:抢滩首店经济,休闲零食品牌的“面子”和“里子”

前不久&#xff0c;苹果静安零售店的首秀频频登上热搜。 这背后&#xff0c;不仅仅因为它是中国大陆最大的苹果旗舰店&#xff0c;还在于它的设计融入了时尚又古典的上海街区&#xff0c;吸引了众多市民拍照打卡。今年3月至5月&#xff0c;上海会持续举办“首发上海”春季系列…

电能计量抄表系统

1.电能计量抄表系统的概念和作用 电能计量抄表系统是一种前沿的自动化控制&#xff0c;主要运用于电力行业的电费计算及管理。它通过远程数据采集和处理&#xff0c;实时监控系统用户的用电状况&#xff0c;取代了传统的手工抄水表方法&#xff0c;降低了成本&#xff0c;降低…

五、VGA 叠加图像原理和实现(十字光标)

前言&#xff1a;该案例在VGA项目&#xff1a;联合精简帧双fifosobel算法 实现VGA显示项目的基础上进行改动。 要求&#xff1a;通过串口助手把 198x198 的十字光标图像二进制数据传递给 FPGA 板卡&#xff0c;FPGA 板 卡接收到后存储到 Ram 中用于 VGA 叠加显示。 预期效果展…

020、Python+fastapi,第一个Python项目走向第20步:ubuntu 24.04 docker 安装mysql8集群+redis集群(一)

系列文章 pythonvue3fastapiai 学习_浪淘沙jkp的博客-CSDN博客https://blog.csdn.net/jiangkp/category_12623996.html 前言 docker安装起来比较方便&#xff0c;不影响系统整体&#xff0c;和前面虚拟环境有异曲同工之妙&#xff0c;今天把老笔记本T400拿出来装了个ubuntu24…