C++ aboutToQuit期间的Qt异步操作
当我的Qt应用程序关闭时,我需要执行一些异步清理活动 我目前的方法是捕获aboutToQuit信号。我启动异步行为,然后应用程序关闭。在异步行为完成之前,是否有任何方法阻止Qt关闭 这通过捕获主窗口的closeEvent并对事件调用ignore()在windows上起作用。但在Mac上,当用户退出时,我的ignore()不受尊重,应用程序在异步活动完成之前关闭C++ aboutToQuit期间的Qt异步操作,c++,macos,qt,qt4,C++,Macos,Qt,Qt4,当我的Qt应用程序关闭时,我需要执行一些异步清理活动 我目前的方法是捕获aboutToQuit信号。我启动异步行为,然后应用程序关闭。在异步行为完成之前,是否有任何方法阻止Qt关闭 这通过捕获主窗口的closeEvent并对事件调用ignore()在windows上起作用。但在Mac上,当用户退出时,我的ignore()不受尊重,应用程序在异步活动完成之前关闭 谢谢。如果必须等待代码完成,为什么要异步启动清理代码 如果您没有将插槽作为QueuedConnection连接到aboutToQuit,
谢谢。如果必须等待代码完成,为什么要异步启动清理代码 如果您没有将插槽作为QueuedConnection连接到aboutToQuit,它将阻塞,直到您的清理代码完成 但如果您确实希望异步启动,则必须手动同步:
QSemaphore wait4CleanupDone;
class MyQuitHandler { ... public slots: void handleQuit(); ... } myQuitHandler;
void MyQuitHandler::handleQuit() { ... ; wait4CleanupDone.release(); }
int main(int argc, char** argv) {
QApplication app(argc, argv);
QObject::connect(&app, SIGNAL(aboutToQuit()), &myQuitHandler, SLOT(handleQuit()));
...
int result = app.exec();
wait4CleanupDone.acquire();
return result;
}
但请注意,在某些情况下,异步代码可能会被忽略:
“我们建议您将清理代码连接到aboutToQuit()信号,而不是将其放入应用程序的main()函数中。这是因为,在某些平台上,QApplication::exec()调用可能不会返回。例如,在Windows平台上,当用户注销时,系统会在Qt关闭所有顶级窗口后终止进程。因此,无法保证应用程序在QApplication::exec()调用后有时间退出其事件循环并在main()函数末尾执行代码。”
From:如果必须等待代码完成,为什么要异步启动清理代码 如果您没有将插槽作为QueuedConnection连接到aboutToQuit,它将阻塞,直到您的清理代码完成 但如果您确实希望异步启动,则必须手动同步:
QSemaphore wait4CleanupDone;
class MyQuitHandler { ... public slots: void handleQuit(); ... } myQuitHandler;
void MyQuitHandler::handleQuit() { ... ; wait4CleanupDone.release(); }
int main(int argc, char** argv) {
QApplication app(argc, argv);
QObject::connect(&app, SIGNAL(aboutToQuit()), &myQuitHandler, SLOT(handleQuit()));
...
int result = app.exec();
wait4CleanupDone.acquire();
return result;
}
但请注意,在某些情况下,异步代码可能会被忽略:
“我们建议您将清理代码连接到aboutToQuit()信号,而不是将其放入应用程序的main()函数中。这是因为,在某些平台上,QApplication::exec()调用可能不会返回。例如,在Windows平台上,当用户注销时,系统会在Qt关闭所有顶级窗口后终止进程。因此,无法保证应用程序在QApplication::exec()调用后有时间退出其事件循环并在main()函数末尾执行代码。”
From:很遗憾,当我尝试此功能时,这里崩溃了 问题是连接呼叫,它总是使main的3号线崩溃
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QObject::connect((QObject *)&app, SIGNAL(aboutToQuit()), (QObject *)&myQuitHandler,
SLOT(QuitApp()), Qt::QueuedConnection );
QGraphicsScene scene(QRectf(0, 0, 640, 480));
..
}
在我开始使用QGraphicscene之后,没有一个信号可以工作了,因为我的连接方式与任何信号都不一样
到目前为止,我们可以解决所有问题,如何在没有“连接”的情况下解决这个问题
我在这里遇到的紧急情况是:
传递给C运行时函数的参数无效。
已退出,代码为-1073741819
很遗憾,当我尝试这个时,这里崩溃了 问题是连接呼叫,它总是使main的3号线崩溃
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QObject::connect((QObject *)&app, SIGNAL(aboutToQuit()), (QObject *)&myQuitHandler,
SLOT(QuitApp()), Qt::QueuedConnection );
QGraphicsScene scene(QRectf(0, 0, 640, 480));
..
}
在我开始使用QGraphicscene之后,没有一个信号可以工作了,因为我的连接方式与任何信号都不一样
到目前为止,我们可以解决所有问题,如何在没有“连接”的情况下解决这个问题
我在这里遇到的紧急情况是:
传递给C运行时函数的参数无效。
已退出,代码为-1073741819
基本上,我需要发出网络请求,但在等待响应到来时不想阻止Qt(但也不想在收到响应之前退出Qt)。我们以另一种方式完全解决了这个问题,但我将标记您的答案,因为这将是解决这个问题的一种方法……基本上,我需要发出网络请求,但在等待响应到来时不想阻止Qt(但也不想在收到响应之前退出Qt)。我们已经完全用另一种方式解决了这个问题,但我将标记您的答案,因为这将是解决这个问题的一种方法。。。