实用指南:Qt QEventLoop的使用的一个问题讨论

news/2025/10/11 15:02:49/文章来源:https://www.cnblogs.com/ljbguanli/p/19132902

实用指南:Qt QEventLoop的使用的一个问题讨论

先看一段代码

int loop=0;
void xxx()
{
int nIndex = loop++;
qDebug()<<"a:"<

这段代码在xxx()函数中用定时器模拟了一个长时间执行的任务,该任务通过放在QEventLoop后面,开启了事件循环来让任务完成后继续执行。

再看另外一段代码

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QPushButton* btn=new QPushButton(this);
this->setCentralWidget(btn);
connect(btn,&QPushButton::clicked,this,&MainWindow::xxx);
}
void MainWindow::xxx()
{
//当前调用顺序值
int nIndex = m_nCurIndex++;
qDebug()<<"a:"<

第二段代码和第一段的区别在于,同样是在xxx()中开启了耗时的任务,并且放在事件循环之后。

此时在界面上用鼠标连续点击三次,看看程序输出。

这是第一段代码的输出

before application exec
a: 0
b: 0
a: 1
b: 1
a: 2
b: 2
a: 3
b: 3
a: 4
b: 4

下面是第二段代码的输出


a: 0
a: 1
a: 2
b: 2
b: 1
b: 0

先思考一下为何有这样的区别。

先说第一段,第一段代码确确实实事件循环阻塞了,它使得五次调用xxx()都是依次调用的。每一次都是一个xxx()函数执行完毕后,进入下一个xxx()

但是第二段,情况有所不一样。当点击第一次按钮,调用xxx()时,会阻塞在eventLoop.exec();

但是用户的界面点击操作并没有被阻塞,用户点击第二次时,信号槽连接的情况下,会第二次进入xxx(),又会阻塞在eventLoop.exec();以及继续点击第三次后,继续进入xxx()阻塞在eventLoop.exec();

所以三次点击后,程序三次阻塞在eventLoop.exec();

之后,三次定时器依次超时,按理说会依次输出b:0     b:1      b:2

但实际情况是反过来的。

需要注意,第二段代码中的三次xxx()是在同一个线程中执行的,它们依据先后顺序在同一个栈里面,所以有了先进的后出,输出结果序列反过来的问题。

考虑第二个问题,当一次点击后进入xxx()阻塞在evenLoop.exec()后,禁止用户点击的第二次立刻相应,否则造成多次重叠,并且最后的执行顺序还是反过来的。

那么使用eventLoop.exec(QEventLoop::ExcludeUserInputEvents);来禁止用户连续的操作

此时,多次连续点击后,第二段代码的输出如下--顺序上已经保证了一致。

a: 0
b: 0
a: 1
b: 1
a: 2
b: 2

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

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

相关文章

Putty设置SSH隧道,隧道和代理的原理区别(KIMI)

Putty设置SSH隧道,隧道和代理的原理区别(KIMI)本文内容为和AI大模型KIMI的对话记录,仅供参考。User: 我有一台服务器,用putty和winscp能够登录,但是jupyterlab启动后无法从笔记本的浏览器进入,应该如何设置?需…

创新突破!天翼云TeleDB数据库通过中国信通院数据库迁移工具专项测试

近日,天翼云数据传输服务软件(DTS)依据《数据库迁移工具能力要求》,结合天翼云TeleDB数据库产品,顺利通过中国信息通信研究院(简称“中国信通院”)“可信数据库”数据库迁移工具专项测试。测试结果表明,天翼云…

Node.js基础库介绍与使用

Node.js 核心库是内置的、无需安装的模块,提供了文件操作(fs)、网络通信(http/https)、路径处理(path)、工具函数(util)、事件驱动(events)、流处理(stream)和加密(crypto)等基础功能,是其强大能力的基…

gaussdb常用操作 - 吾辈当奋斗

启停# root登录 su - gauss # 停止 gs_ctl stop # 启动 gs_ctl start# 单节点启动 su - gauss gssp# 不常用的操作 # 停止gaussdb gs_ctl stop -D 路径 # 启动gaussdb gs_ctl start -D 路径 # 重启gaussdb gs_ctl res…

Go语言熟练使用指南

掌握 Go 语言并达到熟练水平需要系统学习以下几个方面的内容: 一、语言基础核心基础语法和特性 变量声明:var vs 短声明 :=数据类型:基本类型、复合类型、类型转换 控制结构:if/else、for循环、switch 函数:多返回…

Webpack与Vite原理深度解析

好的,我们来深入浅出地解析一下 Webpack 和 Vite 的原理。这两者都是现代前端领域非常重要的构建工具,但它们的核心思想和实现方式有根本性的不同。 核心思想对比特性 Webpack Vite核心理念 Bundle(打包)。将所有模…

详细介绍:华为路由基础1

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

UMich EECS 498-007 / 598-005: Deep Learning for Computer Vision

UMich EECS 498-007 / 598-005: Deep Learning for Computer Vision 资源

IIS8.5 安装证书

问题:iis8.5 导入证书后消失(在IIS中不可见,在证书管理中可以看到,显示缺少私钥)。也可使使用工具查看证书的安装情况 解决方案:参考: openSSL 命令:openssl pkcs12 -export -out output.pfx \ -inkey server.…

2025南通婚纱摄影厂家最新推荐榜:匠心工艺与浪漫美学完美结合

2025婚纱摄影厂家最新推荐榜:匠心工艺与浪漫美学完美结合在当代婚庆消费升级的浪潮中,婚纱摄影行业正经历着深刻的变革。据行业数据显示,2024年中国婚纱摄影市场规模已突破千亿元,新人对婚纱照的需求从简单的场景记…

免费音乐软件,哔哔音乐 免费下载及安装!免费音乐播放器

软件介绍 哔哔音乐是一款基于 B 站音乐资源开发的开源免费音乐播放器,支持安卓和 PC 端。软件下载 哔哔音乐下载地址软件功能特点 操作便捷:软件无须注册登录,打开即可使用,界面简洁,主要有搜索、广场、歌单和设置…

多级缓存架构:性能与数据一致性的平衡处理(原理及优势详解+项目实战) - 教程

多级缓存架构:性能与数据一致性的平衡处理(原理及优势详解+项目实战) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

微信社群开发

微信社群开发,微信机器人制作教程+源码,开发微信机器人/个微/WTAPI框架 微信个人号二次开发,开发微信机器人接口|微信个人号开发|接入指南 微信个人号二次开发,是完整的第三方服务平台,并基于IPAD协议8.0.57开发出…

IStringLocalizer突然失效?线程的“失忆症”

IStringLocalizer服务,配合中间件,根据请求头或Cookie来设置当前线程的语系(Culture)。 问题代码示例: public class HomeController : Controller {private readonly IStringLocalizer<HomeController> _l…

mysql设置最大连接数,MySQL最大连接数设置详解

为什么需要设置最大连接数? MySQL默认的最大连接数是151,这对于小型应用可能够用,但对于高并发场景远远不够。当连接数达到上限时,新的连接请求会被拒绝,出现"Too many connections"错误。了解如何合理…

c# 读取xml到datagridview

c# 读取xml到datagridviewpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

微信机器人API开放!手把手教你打造智能聊天机器人

微信机器人API开放!手把手教你打造智能聊天机器人 ​微信二次开发机器人接口开发,java之微信机器人二次开发,微信机器人制作教程API文档 接入指南 对接流程 1.申请api平台账号 2.开通接口权限 3.对接api 4.测试上线…

十二重计数法

Link,限制依次为: \(1\):球之间互不相同,盒子之间互不相同。 \(2\):球之间互不相同,盒子之间互不相同,每个盒子至多装一个球。 \(3\):球之间互不相同,盒子之间互不相同,每个盒子至少装一个球。 \(4\):球之间…

KLT就是Android中开一个线程是ULT还

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java高手速成--吃透源码+手写组件+定制开发

/s/10rCdjsps17doYfmJKhBPjA 提取码:8l4r /s/1Ma6lU6jMzhfrh4OVD9C21A 提取码: 7sq3 在Java编程的浩瀚宇宙中,无数开发者日复一日地敲击着代码,却只有少数人能够穿越表象,抵达精通的彼岸。当“Java高手速成——吃透…