Qt异步操作在aboutToQuit期间

时间:2010-02-26 19:33:07

标签: c++ macos qt qt4

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

我目前的做法是捕获aboutToQuit信号。我启动了我的异步行为,然后应用程序关闭。有没有办法阻止Qt关闭,直到我的异步行为完成?

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

感谢。

2 个答案:

答案 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()函数结束。“

来自:http://doc.trolltech.com/4.6/qapplication.html#exec

答案 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