Qt异步操作在aboutToQuit

Qt异步操作在aboutToQuit

问题描述:

我有一些异步清理活动,我需要做的,因为我的Qt应用程序正在关闭。Qt异步操作在aboutToQuit

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

这可以通过捕获主窗口的closeEvent并在事件上调用ignore()来工作。但在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()函数末尾执行代码。“

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

+0

基本上,我需要让网络请求,但并不想阻止Qt的,而我等待响应进来(但不想Qt来作出退学决定之前,我有反应)。我们已经完全以另一种方式解决了这个问题,但我要标记您的答案,因为这将是解决问题的一种方法。 – 2010-03-01 19:24:23

崩溃这里令人遗憾的是,当我尝试这一点。

问题是连接调用,其中它allaedy崩溃主线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