在c++项目中。有 加载动画 和 模态框提醒的功能, 导致发生一个问题,有提示框的时候,动画也停止,必须点击 按钮 所有代码才能有效。
解决办法
谨慎使用 deleteLater,因为和模态框拦截有冲突, 使用 隐藏 或者 删除指针。
deleteLater 使用逻辑是 走的事件删除,但是需要中,早已把事件 拦截导致无法关闭动画,
感谢同事,基础知识扎实,一起帮忙解决问题,一个是事件和队列 配合删除 一个是 直接摧毁。
void xxxxxxxx::removeUseCount()
{
if (s_pLoadIndicator == nullptr)
{
return;
}
else
{
int iUseCount = xxxxxxxx->useCountDecrease();
if (iUseCount <= 0)
{
s_pLoadIndicator->deleteLater();
s_pLoadIndicator = nullptr;
}
}
}
void xxxxxxxx::removeUseDelete()
{
if (s_pLoadIndicator == nullptr)
{
return;
}
else
{
int iUseCount = xxxxxxxx->useCountDecrease();
if (iUseCount <= 0)
{
delete s_pLoadIndicator;
s_pLoadIndicator = nullptr;
}
}
}
Qt5 -- 超好用的"deleteLater()" - 知乎
QT delete和deletelater的区别-CSDN博客
答案在文档中
计划删除此对象。
当控件返回到事件循环时,对象将被删除。如果调用此函数时事件循环未运行(例如,在QCoreApplication::exec()之前对对象调用deleteLater()),则一旦事件循环启动,该对象将被删除。如果在主事件循环停止后调用deleteLater(),则不会删除该对象。自Qt 4.8以来,如果在没有运行事件循环的线程中调用deleteLater()对象,则该对象将在线程结束时被销毁。
请注意,进入和离开新的事件循环(例如,通过打开模式对话框)将不会执行延迟删除;对于要删除的对象,控件必须返回到调用deleteLater()的事件循环。这不适用于在上一个嵌套事件循环仍在运行时删除的对象:新的嵌套事件循环一开始,Qt事件循环就会删除这些对象。
衍生出来的问题, 线程和安全的问题
Java并发-线程与进程、线程安全、锁、阻塞队列详解,看这一篇就够了_java 进程锁-CSDN博客
PHP开发中如何优化并发操作和线程安全-php教程-PHP中文网
参考分析
qt事件循环阻塞机制分析_使用阻塞的exec调用 qt-CSDN博客
Qt互斥锁(QMutex)的使用、QMutexLocker的使用(含源码+注释) - 知乎
Qt消息循环与模态对话框和线程关系整理_qdialog能接受主线程-CSDN博客