`Qt`没有通过`QCoreApplication::exec()`或`QEventLoop::exec()`驱动事件分发器时,处理延迟删除的具体例子

news/2024/11/18 1:55:50/文章来源:https://www.cnblogs.com/DesertCactus/p/18551492

以下是一个使用C++和Qt框架来演示在Qt没有通过QCoreApplication::exec()QEventLoop::exec()驱动事件分发器时,处理延迟删除的具体例子,假设我们有一个简单的自定义类,它在析构时需要执行一些清理工作,并且希望利用延迟删除机制:

1. 自定义类定义

首先创建一个简单的自定义类MyObject,它继承自QObject,并且在析构函数中有一些打印语句用于模拟清理操作:

#include <QObject>
#include <iostream>class MyObject : public QObject
{Q_OBJECT
public:MyObject() {}~MyObject() {std::cout << "MyObject is being deleted and performing cleanup." << std::endl;}
};

2. 不使用常规事件循环的情况及变通方法示例

通常情况下,如果在基于QCoreApplication::exec()的常规应用中,当对象被设置为延迟删除(例如使用deleteLater()函数)时,Qt会在事件循环的适当时候自动处理这个删除操作并调用析构函数。但现在假设我们没有启动常规的事件循环,代码如下:

#include <QCoreApplication>
#include <QTimer>int main(int argc, char *argv[])
{// 这里不启动常规的QCoreApplication事件循环// QCoreApplication a(argc, argv); MyObject* obj = new MyObject();// 正常我们可能会调用obj->deleteLater();期望自动延迟删除// 但现在没有事件循环驱动,不会自动处理// 变通方法,使用单次触发的定时器来模拟事件循环对延迟删除的处理QTimer::singleShot(0, obj, &MyObject::deleteLater);// 这里我们手动模拟事件循环的单次迭代来处理定时器等事件,触发延迟删除QCoreApplication::processEvents();return 0;
}

在上述代码中:

  • 首先我们注释掉了QCoreApplication a(argc, argv);这行代码,意味着没有启动常规的Qt应用事件循环,也就是处于Qt不通过QCoreApplication::exec()驱动事件分发器的情况。
  • 我们创建了一个MyObject类型的指针obj,如果是在正常有事件循环的应用中,调用obj->deleteLater();后,Qt会自动在合适的事件循环周期内处理这个对象的删除(调用析构函数)。但现在没有事件循环,不会自动处理。
  • 为了变通处理,我们使用了QTimer::singleShot(0, obj, &MyObject::deleteLater);,这表示创建一个单次触发的定时器,定时器一启动(这里时间间隔设为0,表示立即触发)就会调用objdeleteLater()函数,将其标记为延迟删除。
  • 最后通过QCoreApplication::processEvents();手动去处理一下事件,这样就能模拟事件循环去处理这个延迟删除的操作,使得MyObject的析构函数得以被调用,进而执行里面模拟的清理工作(这里就是打印语句所表示的内容)。

请注意,这只是一个简单的示例用于说明在特定情况(无常规事件循环)下如何处理延迟删除的变通方法,实际应用场景可能会更复杂,需要根据具体的程序逻辑和需求来合理调整代码。

另外,如果涉及到更复杂的对象关系、多线程等情况,还需要考虑更多诸如对象的父子关系管理、线程安全等方面的问题,确保延迟删除操作按照预期执行且不会引发程序错误。

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

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

相关文章

【圆圆的日语教室】日语入门第2课-平假名的书写+了解日本

第二课 相似的假名平假名的书写あ (a) 的书写第二笔不要太直,它是从草书演变过来的,特点是圆润有弧度 第三笔要交叉 长得像“安”い (i) 的书写第一笔要勾上去う (u) 的书写第一笔:点第二笔:起笔不要太平,先往上走再往下拐。联想记忆:u住耳朵え (e) 的书写联想:e,见到一…

Scrum 冲刺博客-day3

这个作业属于哪个课程 班级的链接这个作业要求在哪里 作业要求的链接这个作业的目标 Scrum 冲刺博客-day3团队成员 梁志聪 李永杰 曾繁曦一、会议照片二、工作情况成员 昨天已完成工作 今日计划工作梁志聪 编写主菜单,人物移动相关代码 设计障碍物,实现人物碰撞李永杰 构思大…

基于RDK X5的智慧交通监控系统

本Blogs同步发表至CSDN:https://blog.csdn.net/xiongqi123123/article/details/143840675?sharetype=blogdetail&sharerId=143840675&sharerefer=PC&sharesource=xiongqi123123&spm=1011.2480.3001.8118 一、项目背景在当前高等教育普及化、大学持续扩招的宏…

【ai+模型】五大主流开源大模型RAG评估框架详解

RAG 评估的挑战 增强检索生成技术(Retrieval Augmented Generation,简称 RAG)目前正成为增强大语言模型(LLM)性能的核心手段。该技术通过将外部知识库融入LLM,大幅提升了大模型的精确度和对上下文的感知力。然而,对 RAG 系统性能的评测颇具挑战,这促使了一系列开源 RAG…

【待发】CyberEdge:简洁而强大的互联网资产测绘工具

免责声明 利⽤本文所提供的信息而造成的任何直接或者间接的后果及损失,均由使⽤者本⼈负责,创作者及作者不为此承担任何责任,一旦造成后果请自行承担责任!简介: CyberEdge是一款精心设计的互联网资产测绘工具,为网络安全专业人士提供精准、高效的扫描体验。 核心特性: 全…

Spring Security 认证授权(黑马讲义)

1.基本概念 1.1.什么是认证 用户认证就是判断一个用户的身份是否合法的过程,用户去访问系统资源时系统要求验证用户的身份信息,身份合法方可继续访问,不合法则拒绝访问。常见的用户身份认证方式有:用户名密码登录,二维码登录,手机短信登录,指纹认证等方式。 1.2.什么是授…

SkyWalking 安装部署操作指引

环境 CentOS-7-x86_64-DVD-2009.iso https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso apache-skywalking-apm-10.0.1.tar.gz https://dlcdn.apache.org/skywalking/10.0.1/apache-skywalking-apm-10.0.1.tar.gz jdk-11.0.23_linux-x64_bin.tar.…

Win11 24H2 使用Rclone将SMB协议链接转为本地磁盘驱动器

9月份升级了ITX主机,多了好几块机械硬盘, 后来又买了Nas, 先装了飞牛Nas系统, 结果要格盘,考虑到Refs, Zfs, exFAT 在坏盘情况对数据恢复不友好, 决定改用Win11作为Nas 系统 .Windows 做Nas 系统不要太好, 免去各类docker 的缓慢和配置,可以正常使用迅雷等各类软件,并且很多Nas…

在Keil中使用ST-LINK烧录STM32程序指南

前言 之前玩STM32都是用J-LINK烧录程序,不仅便捷,而且烧录的速度比用串口快好多。 最近我接了几个32单片机的毕设单子,便买了几块C8T6的最小系统板用来开发。最初我还是用J-LINK烧录C8T6的,只要从J-LINK中找出对应的引脚用杜邦线连上就可以烧录,但是每晚要去学校的实验室,…

第八章习题

学号后四位:3018 8.4:点击查看代码 import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt# 定义微分方程组 def differential_equations(state, t):x, y = statedxdt = -x ** 3 - ydydt = x - y ** 3return [dxdt, dydt]# 设定初始条件 ini…

Next App Router 模式下,如何同步服务端 Redux 初始状态?

大家的阅读是我发帖的动力,本文首发于我的博客:deerblog.gu-nami.com/,欢迎大家来玩,转载请注明出处喵。🎈前言 Next.js 是一个广受欢迎的 React 服务端渲染(Server Side Rendering,SSR)框架。Next.js 的页面会先在服务端渲染一次,然后把结果传给浏览器,也就是客户端…

Git版本管理系统快速上手指南

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.git命令初体验1.搭建Golang开发环境2.git init项目初始化3.git status查看工作目录状态4.git add将文件从工作区提交到暂存区5.git config配置git个人信息6.git commit提交代码到本地仓库7.git log查看…