2010-02-26 68 views
1

我有一些異步清理活動,我需要做的,因爲我的Qt應用程序正在關閉。Qt異步操作在aboutToQuit

我目前的做法是捕獲aboutToQuit信號。我啓動我的異步行爲,然後應用程序關閉。是否有任何方法阻止Qt關閉,直到我的異步行爲完成?

這可以通過捕獲主窗口的closeEvent並在事件上調用ignore()來工作。但在Mac上,當用戶退出時,我的ignore()不受尊重,並且在異步活動完成之前關閉應用程序。

謝謝。

回答

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

+0

基本上,我需要讓網絡請求,但並不想阻止Qt的,而我等待響應進來(但不想Qt來作出退學決定之前,我有反應)。我們已經完全以另一種方式解決了這個問題,但我要標記您的答案,因爲這將是解決問題的一種方法。 – 2010-03-01 19:24:23

0

崩潰這裏令人遺憾的是,當我嘗試這一點。

問題是連接調用,其中它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