当我的Qt应用程序关闭时,我需要执行一些异步清理活动。
我目前的做法是捕获aboutToQuit信号。我启动了我的异步行为,然后应用程序关闭。有没有办法阻止Qt关闭,直到我的异步行为完成?
这可以通过捕获主窗口的closeEvent并在事件上调用ignore()来在Windows上运行。但是在Mac上,当用户退出时,我的ignore()不受尊重,应用程序在异步活动完成之前关闭。
感谢。
答案 0 :(得分:1)
如果在代码完成之前必须等待,为什么要异步启动清理代码?
如果你没有将你的插槽作为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()函数结束。“
答案 1 :(得分:0)
当我尝试这个时,遗憾地崩溃了。
问题是连接调用,其中alraedy崩溃了主线的第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));
..
}
在我开始使用qgraphicsscene之后,没有一个信号可以正常工作,因为我没有以任何信号工作的方式连接它。
到目前为止可以解决所有问题,如何在没有“连接”的情况下解决这个问题?
我遇到的崩溃是即时的:
传递给C运行时函数的参数无效。 退出代码-1073741819