Почему вы запускаете свой код очистки асинхронно, если вам все равно придется ждать, пока ваш код будет готов?
Если вы не подключаете свой слот как 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 закрывает все окна верхнего уровня. Следовательно, нет никакой гарантии, что приложение успеет выйти из цикла обработки событий и выполнить код в конец функции main () после вызова QApplication :: exec (). "
От: http://doc.trolltech.com/4.6/qapplication.html#exec