当前位置:网站首页>Qt 中 deleteLater 使用总结
Qt 中 deleteLater 使用总结
2022-06-26 02:51:00 【litanyuan】
背景
deleteLater 是 QObject 类对象的成员函数,用于延迟删除一个 QObject 类对象,且对 QObject 类对象的删除推荐使用 deleteLater 而非 delete 。
deleteLater
①.概述
deleteLater 依赖于事件循环,调用 deleteLater 后本质是发送了一个 DeferrerDelete 事件,在事件循环处理中把对象删除。
②.代码示例
demo = new QtClassDemo(this);
demo->deleteLater();
demo = nullptr;
deleteLater 和 delete
①.deleteLater 会在当前对象的所有事件处理完成后再删除对象
demo = new QtClassDemo(this);
demo->setObjectName("demo");
qApp->postEvent(demo, new CustomEvent("hello"));
qApp->postEvent(demo, new CustomEvent("world"));
demo->deleteLater();
demo = nullptr;
②.delete 则是立即删除对象,对象的既有事件不再处理
demo = new QtClassDemo(this);
demo->setObjectName("demo");
qApp->postEvent(demo, new CustomEvent("hello"));
qApp->postEvent(demo, new CustomEvent("world"));
delete demo;
demo = nullptr;
③.deleteLater 后依然可以访问和操作对象,直到再次回到事件循环
demo = new QtClassDemo(this);
demo->setObjectName("demo");
demo->deleteLater();
qDebug() << demo->objectName();
demo = nullptr;
deleteLater 和 QSharedPointer
①.概述
智能指针可以传入自定义的删除器,对于继承自 QObject 的类对象可以传入 deleteLater 。
②.代码示例
QSharedPointer<QtClassDemo> demoClass(new QtClassDemo(this), &QObject::deleteLater);
deleteLater 和 moveToThread
①.概述
moveToThread 的本质是把 QObject 对象到事件循环移动到子线程进行处理:
qDebug() << "主线程:"<< QThread::currentThread();
QThread * workThread = new QThread;
demo = new QtClassDemo(nullptr);
demo->setObjectName("demo");
demo->moveToThread(workThread);
workThread->start();
bool QtClassDemo::event(QEvent * event)
{
qDebug() << "事件处理线程:"<< QThread::currentThread() << event->type();
return QObject::event(event);
}
②.利用 deleteLater 进行资源清理
//工作对象工作完成,停止线程
QObject::connect(workObject,&WorkObject::workFinished,[&](){
workThread->quit();
workThread->wait();
});
//工作线程停止,删除工作对象
QObject::connect(workThread,&QThread::finished,workObject,&WorkObject::deleteLater );
//工作对象销毁,删除工作线程
QObject::connect(workObject,&WorkObject::destroyed,workThread,&QThread::deleteLater );
边栏推荐
- Cliquez sur le bouton action de la liste pour passer à une autre page de menu et activer le menu correspondant
- 类图
- 丝网印刷的种类及其应用方法
- Translation notes of orb-slam series papers
- How to prompt
- ArrayList#subList这四个坑,一不小心就中招
- arduino字符串转16进制数 大彩串口屏用。
- MySQL数据库基础
- 力扣(LeetCode)176. 第二高的薪水(2022.06.25)
- Hardware creation principle of campus maker space
猜你喜欢
Camtasia 2022 new ultra clear recording computer video
Qt编译出错ERROR: Unknown module(s) in QT: script
如何提词条
【哈希表】很简单的拉链法哈希结构,以至于效果太差,冲突太多,链表太长
QT compilation error: unknown module (s) in qt: script
The "eye" of industrial robot -- machine vision
Matlab| short term load forecasting of power system based on BP neural network
请求对象,发送请求
Utonmos adheres to the principle of "collection and copyright" to help the high-quality development of traditional culture
【解决】联想拯救者vmware启动虚拟机蓝屏重启问题
随机推荐
todolist未完成,已完成
Authorization of database
Cultivate children's creativity under the concept of project steam Education
培育项目式Steam教育理念下的儿童创造力
Leetcode 175 Combine two tables (2022.06.24)
经典模型——AlexNet
浅谈虚拟内存与项目开发中的OOM问题
丝网印刷的种类及其应用方法
How Inkscape converts PNG pictures to SVG pictures without distortion
Vulhub replicate an ActiveMQ
Qt编译出错ERROR: Unknown module(s) in QT: script
Camtasia 2022 new ultra clear recording computer video
[hash table] improved, zipper hash structure - directly use two indexes to search, instead of hashing and% every time
【解决】CMake was unable to find a build program corresponding to “Unix Makefiles“.
On virtual memory and oom in project development
What can Arthas do for you?
Wealth freedom skills: commercialize yourself
Problems encountered in project deployment - production environment
Hardware creation principle of campus maker space
gstreamer分配器与pool的那些事