我有一些異步清理活動,我需要做的,因爲我的Qt應用程序正在關閉。Qt異步操作在aboutToQuit
我目前的做法是捕獲aboutToQuit信號。我啓動我的異步行爲,然後應用程序關閉。是否有任何方法阻止Qt關閉,直到我的異步行爲完成?
這可以通過捕獲主窗口的closeEvent並在事件上調用ignore()來工作。但在Mac上,當用戶退出時,我的ignore()不受尊重,並且在異步活動完成之前關閉應用程序。
謝謝。
我有一些異步清理活動,我需要做的,因爲我的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()函數末尾執行代碼。「
崩潰這裏令人遺憾的是,當我嘗試這一點。
問題是連接調用,其中它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
基本上,我需要讓網絡請求,但並不想阻止Qt的,而我等待響應進來(但不想Qt來作出退學決定之前,我有反應)。我們已經完全以另一種方式解決了這個問題,但我要標記您的答案,因爲這將是解決問題的一種方法。 – 2010-03-01 19:24:23