Qt:关闭期间的事件循环
Qt: event loop during closing
根据本文,当我们关闭一个Qt程序时,可以这么说吗。一旦mainWindow的关闭事件启动,除了GUI线程中的关闭事件处理程序和类解构器之外,什么都不会执行?
例如,如果存在QTimer
,则GUI线程中的timeout()
信号被激发到同一线程中的slot
。当mainWindow的关闭事件开始时,插槽将不会有任何机会再次执行?
不,表面上说,一旦mainWindow的关闭事件启动,除了关闭事件处理程序和类析构函数之外,GUI线程中不会执行其他任何东西是错误的。
假设我们有以下代码(在C++11中):
#include <QApplication>
#include <QLabel>
#include <QMessageBox>
#include <QTimer>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QLabel label1("Hello, World!");
label1.show();
label1.setMinimumSize(200, 100);
app.exec();
QTimer timer;
int counter = 0;
QObject::connect(&timer, &QTimer::timeout, [&counter]{ counter ++; });
timer.start(100);
QMessageBox::information(nullptr, "Done",
QString("We're Done with "%1"").arg(label1.text()));
QMessageBox::information(nullptr, "Really Done",
QString("Timer has ticked %1 times").arg(counter));
return 0;
}
显然,非析构函数代码将在exec()
返回后执行——这里我们显示了一个消息框。主窗口,在本例中为QLabel
,在exec()
返回之后仍然存在。
假设exec()
返回后计时器将以某种方式被全局终止也是不正确的。它们仍在运行,只要你重新启动事件循环,它们就会很乐意为你开火。毕竟,第二个消息框将显示一个非零计数。
你的问题应该用你试图解决的问题来改写。你要求的是非常具体的细节,这些细节本身没有什么意义。请告诉用户为什么要问这样的问题。
自动处理:
QObject::~QObject()
所有进出对象的信号都会自动断开,并且该对象的任何挂起的已发布事件都将从事件中删除队列但是,通常使用deleteLater()比直接删除QObject子类。
然而,对于多线程应用程序,您需要使用deleteLater()
来避免崩溃:
警告:正在等待挂起事件时删除QObject交付可能会导致崩溃。不能直接删除QObject如果它存在于与当前执行的线程不同的线程中。改为使用deleteLater(),这将导致事件循环删除在所有未决事件都已传递到对象之后的对象。
- 具有Qt事件循环的可移植通用共享库设置
- 如何将事件循环中的事件分派给订阅者?
- C++uWebSockets将事件循环集成到一个线程中
- 了解如何在不冻结事件循环的情况下在 QThread 中休眠/等待
- 如何在主事件循环之前创建一些对象?
- Libuv:保护事件循环免受并发访问
- 防止模式对话框中的事件循环阻塞
- QCoreApplication事件循环和Windows服务控制处理程序功能
- c++ 过期映射条目线程与事件循环
- Qt的事件循环线程是安全的还是原子的?处理"队列连接"时如何同步?
- 在事件循环启动后删除并创建新的 RTP 流
- QSTATEMACHINE事件循环与动画
- 等待事件循环为空 /等到QT5小部件关闭
- 如何将lambda函数排队到Qt的事件循环中?
- DLL中的QT事件循环
- 运行Qt 5.10事件循环howto的Windows服务service_WIN32_OWN_PROCESS
- 模态qprogressdialog :: setValue()导致嵌套事件循环崩溃
- 什么是QT中的事件循环
- Libuv中SD-BUS的事件循环处理
- Qt的事件循环是FIFO吗?