C++ aboutToQuit期间的Qt异步操作

C++ aboutToQuit期间的Qt异步操作,c++,macos,qt,qt4,C++,Macos,Qt,Qt4,当我的Qt应用程序关闭时,我需要执行一些异步清理活动 我目前的方法是捕获aboutToQuit信号。我启动异步行为,然后应用程序关闭。在异步行为完成之前,是否有任何方法阻止Qt关闭 这通过捕获主窗口的closeEvent并对事件调用ignore()在windows上起作用。但在Mac上,当用户退出时,我的ignore()不受尊重,应用程序在异步活动完成之前关闭 谢谢。如果必须等待代码完成,为什么要异步启动清理代码 如果您没有将插槽作为QueuedConnection连接到aboutToQuit,

当我的Qt应用程序关闭时,我需要执行一些异步清理活动

我目前的方法是捕获aboutToQuit信号。我启动异步行为,然后应用程序关闭。在异步行为完成之前,是否有任何方法阻止Qt关闭

这通过捕获主窗口的closeEvent并对事件调用ignore()在windows上起作用。但在Mac上,当用户退出时,我的ignore()不受尊重,应用程序在异步活动完成之前关闭


谢谢。

如果必须等待代码完成,为什么要异步启动清理代码

如果您没有将插槽作为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)。我们已经完全用另一种方式解决了这个问题,但我将标记您的答案,因为这将是解决这个问题的一种方法。。。