QTimer::singleShot导致定时器资源耗尽解决方法

news2024/12/28 18:56:47

参考文章:Qt QTimer::singleShot问题及用法

1. 问题描述

QTimer::singleShot定时器事件超时,如果此时类内对象已经被回收,定时器事件调用已经释放的类内资源时会引起崩溃。

这通常是因为定时器的回调函数(槽函数)在执行时可能会导致事件循环被阻塞,进而导致定时器无法正常触发,或者在高频率调用时,定时器的数量迅速增加,造成资源消耗过大。

QTimer::singleShot(100, this, [=]() {
	LOG(INFO) << QString::fromLocal8Bit("____QTimer::singleShot testtest____").toStdString();
	LOG(INFO) << QString::number(i).toStdString();
});

2. 百分百复现

可使用以下代码:

在while语句中不停使用QTimer::singleShot。

while (1)
{
	QTimer::singleShot(100, this, [=]() {
		LOG(INFO) << QString::fromLocal8Bit("____QTimer::singleShot testtest____").toStdString();
		LOG(INFO) << QString::number(i).toStdString();
	});
}

 

报错如图所示:

3. 解决方法1:使用QCoreApplication::processEvents()

while (1)
{
	QCoreApplication::processEvents();
	QTimer::singleShot(100, this, [=]() {
		LOG(INFO) << QString::fromLocal8Bit("____QTimer::singleShot testtest____").toStdString();
		LOG(INFO) << QString::number(i).toStdString();
	});
}

 QCoreApplication::processEvents() 是 Qt 框架中的一个函数,用于处理事件循环中的待处理事件。它的主要作用是使应用程序能够在某些情况下处理事件,比如用户输入、定时器超时等,而不会阻塞程序的执行。

QCoreApplication::processEvents() 的作用

  1. 处理事件:当调用 processEvents() 时,Qt 会处理所有待处理的事件,包括定时器事件。这意味着即使在某个长时间运行的操作中,定时器也有机会被触发,从而避免了定时器的回调函数无法执行的问题。

  2. 避免阻塞:如果在槽函数中执行了耗时的操作,调用 processEvents() 可以让事件循环继续运行,处理其他事件,防止应用程序因为一个长时间运行的操作而完全无响应。

  3. 释放资源:通过让事件循环处理其他事件,processEvents() 可以帮助释放一些资源,避免因为定时器未能及时触发而造成的资源泄漏。

4. 解决方法2:用定时器代替QTimer::singleShot

while (1)
{
	QTimer *t = new QTimer;
	connect(t, &QTimer::timeout, [=]() {
		LOG(INFO) << QString::fromLocal8Bit("____QTimer::singleShot testtest____").toStdString();
		LOG(INFO) << QString::number(i).toStdString();
	});
	t->setSingleShot(true);
	t->start(50);
}

while (1)
{
	QTimer *t = new QTimer;
	connect(t, &QTimer::timeout, [=]() {
		t->stop();
		t->deleteLater();
		LOG(INFO) << QString::fromLocal8Bit("____QTimer::singleShot testtest____").toStdString();
		LOG(INFO) << QString::number(i).toStdString();
	});
	t->start(50);
}

5. 解决方法3:设置interval为0

while (1)
{
	QTimer *t = new QTimer;
	t->singleShot(0, this,connect(t, &QTimer::timeout, [=]() {
		LOG(INFO) << QString::fromLocal8Bit("____QTimer::singleShot testtest____").toStdString();
		LOG(INFO) << QString::number(i).toStdString();
	});
}

while (1)
{
	QTimer::singleShot(0, this,connect(t, &QTimer::timeout, [=]() {
		LOG(INFO) << QString::fromLocal8Bit("____QTimer::singleShot testtest____").toStdString();
		LOG(INFO) << QString::number(i).toStdString();
	});
}

虽然这个方法可以使其不报错,但是因为设置interval为0,对于时间间隔为0的事件,甚至连QSingleShotTimer都不需要创建,而是直接用invokeMethod去调用相应的slot,所以定时器不算响应了。

参考文章:QTimer源码分析(以Windows下实现为例)_qtimer::singleshot源码及分析-CSDN博客

 

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

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

相关文章

网工能保住饭碗的小技能-划分VLAN

网络工程师&#xff0c;咱也是有一定的专业的知识和技能&#xff0c;今天&#xff0c;我们就来聊聊网络工程师的一项核心技能——VLAN划分&#xff0c;以及它如何成为网络工程师职业生涯中的“铁饭碗”。 VLAN&#xff0c;全称Virtual Local Area Network&#xff08;虚拟局域…

MVCC数据库并发控制技术

一、引言 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是一种广泛使用的数据库并发控制技术&#xff0c;它允许数据库读操作和写操作并发执行&#xff0c;而无需加锁整个表或行&#xff0c;从而大大提高了数据库的并发性能和吞吐量。MVCC主要被应用于支持事…

Java学习 - Spring Boot整合 Thymeleaf 实例

什么是 Thymeleaf Thymeleaf 是新一代的 Java 模板引擎&#xff0c;类似于 Velocity、FreeMarker 等传统引擎&#xff0c;其语言和 HTML 很接近&#xff0c;而且扩展性更高&#xff1b; Thymeleaf 的主要目的是将优雅的模板引入开发工作流程中&#xff0c;并将 HTML 在浏览器中…

IEEE官方列表会议 | 第三届能源与环境工程国际会议(CFEEE 2024)

会议简介 Brief Introduction 2024年第三届能源与环境工程国际会议(CFEEE 2024) 会议时间&#xff1a;2024年12月2日-4日 召开地点&#xff1a;澳大利亚凯恩斯 大会官网&#xff1a;CFEEE 2024-2024 International Conference on Frontiers of Energy and Environment Engineer…

信创改造叠加等保/密评合规,服务器定期改密难落实?

信创国产化改造是我国党政、金融、电信、电力等行业信息安全建设的主旋律。在信创改造背景下还叠加了等保、密评等合规性要求&#xff0c;因此党政、金融等行业单位在建设信创应用、终端、服务器时必须满足等保、密评要求。 在数据中心运维场景&#xff0c;受行业监管、密评、…

SQL 注入漏洞详解 - Union 注入

1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,…

javaScrip的学习(一)

目录 引言 一、java和JavaScript的联系 二、js中的弹出框 1.alert弹出框 2.confirm带确认取消的按钮弹框 3.prompt带有提示信息且带有输入框的弹框 4.输出到网页中 ​三、js引入方式 1. 放在script标签中 2.放在外部js文件中 四、执行顺序 五、书写规范 1. 语句结…

专业技能(挖坑填坑)——Java核心基础知识,对集合、线程

熟悉Java核心基础知识&#xff0c;对集合、线程等都有了解&#xff0c;能运用模块化、面向对象的方式编程。 1.Java八种基本数据类型 Java的数据类型分为两大类&#xff1a;①基本数据类型 ②引用数据类型 2.面向对象三大特性 封装、继承、多态。 简要介绍一下/谈一下你的…

为什么 FPGA 的效率低于 ASIC?

FPGA是“可重构逻辑”器件。先制造的芯片&#xff0c;再次设计时“重新配置”。 ASIC 不需要“重新配置”。你先设计&#xff0c;把它交给代工厂&#xff0c;然后制造芯片。 现在让我们看看这些芯片的结构是什么样的&#xff0c;以及它们的不同之处。 ● 逻辑单元&#xff1a;F…

(leetcode学习)21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]示例…

Ethernet/IP转ModbusTCP协议转化网关(经典通讯案例)

怎么样把EtherNet/IP和ModbusTCP网络通讯连接起来呢?最近有很多朋友咨询这个问题&#xff0c;在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题&#xff0c;名为YC-EIP-TCP&#xff0c;下面是详细信息。 一&#xff0c;设备主要功能 1YC-EIP-TCP工业级…

数据结构(5.3_1)——二叉树的先中后序遍历

先序遍历——根左右——前缀表达式 中序遍历——左根右——中缀表达式 后序遍历——左右根——后缀表达式 二叉树的遍历(手算) 先序遍历代码 struct ElemType {int value; }; //二叉树的结点(链式存储) typedef struct BiTNode {ElemType data;//数据域struct BiTNode *lchil…

数据采集产品 搭建智能水房实现远程控制的案例分享

一、系统简介 随着科技的逐步发达&#xff0c;在各个领域都迫切的希望有一种控制系统能代替传统的操作方式&#xff0c;智能水房控制系统则是一种符合人们要求的系统&#xff0c;他可代替传统的人工机械操控&#xff0c;真正实现控制智能化。通过水房的各种数据采集可以实现24小…

学习记录——day15 数据结构 链表

链表的引入 顺序表的优缺点 1、优点:能够直接通过下标进行定位元素&#xff0c;访问效率高&#xff0c;对元素进行查找和修改比较快 2、不足:插入和删除元素需要移动大量的元素&#xff0c;效率较低 3、缺点:存储数据元素有上限&#xff0c;当达到MAX后&#xff0c;就不能再…

VScode tab不能正常使用

现象不能够在文本编辑器中按下tab键&#xff0c;如果按下了&#xff0c;就焦点会跑到终端或者是其他地方&#xff0c;猜测是因为装了某些插件导致的。 解决方案比较简单&#xff1a; 删除掉其他的按键 比如这样的&#xff0c;保存就可以了

mysql1055报错解决方法

目录 一、mysql版本 二、 问题描述 三、解决方法 1.方法一&#xff08;临时&#xff09; 2.方法二&#xff08;永久&#xff09; 一、mysql版本 mysql版本&#xff1a;5.7.23 二、 问题描述 在查询时使用group by语句&#xff0c;出现错误代码&#xff1a;1055&#xf…

Facebook的创新之路:科技驱动的社交革命

Facebook自2004年创立以来&#xff0c;已经从一个大学校园内的社交网站发展成为全球最大的社交媒体平台。其成功的背后&#xff0c;不仅仅是广泛的用户基础和高效的运营模式&#xff0c;更在于其不断推进的技术创新。本文将探讨Facebook在技术创新方面的诸多努力&#xff0c;如…

MYSQL 六、mysql锁 1

一、概述 在数据库中&#xff0c;除传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的 资源。为保证数据的一致性&#xff0c;需要对 并发操作进行控制 &#xff0c;因此产生了 锁 。同时 锁机制 也为实现MySQL 的各…

GitHub Actions是什么

目录 GitHub Actions是什么 GitHub Actions的使用方法 示例 注意事项 GitHub Actions配置文件中-工作流的 :Workflow 一、自动化任务执行 二、规范团队协作 三、灵活配置和定制 四、提高开发效率 五、集成GitHub生态 六、可复用性和共享性 仓库中的“Actions”部分…

新生上大学提前去西藏旅游有什么要注意的,语言上该怎么办?

新生前往西藏旅游并提前适应大学生活是一次充满挑战与发现的旅程。在准备过程中&#xff0c;重要的是要对高原反应有所准备&#xff0c;了解其症状并采取预防措施&#xff0c;同时携带必要的防晒和保暖衣物以应对极端的气候条件。在交通和饮食方面&#xff0c;选择安全可靠的选…