Qt Асинхронное действие во время aboutToQuit - PullRequest
1 голос
/ 26 февраля 2010

У меня есть некоторые действия по асинхронной очистке, которые мне нужно выполнить, когда мое приложение Qt закрывается.

Мой нынешний подход - перехватывать сигнал aboutToQuit. Я запускаю асинхронное поведение, а затем приложение закрывается. Есть ли способ заблокировать отключение Qt до завершения моего асинхронного поведения?

Это работает на окнах, перехватывая closeEvent главного окна и вызывая ignore () для события. Но на Mac, когда пользователь завершает работу, мой ignore () не учитывается, и приложение завершает работу до завершения моей асинхронной активности.

Спасибо.

Ответы [ 2 ]

1 голос
/ 27 февраля 2010

Почему вы запускаете свой код очистки асинхронно, если вам все равно придется ждать, пока ваш код будет готов?

Если вы не подключаете свой слот как 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

0 голосов
/ 13 апреля 2012

К сожалению, здесь происходит сбой, когда я пытаюсь это сделать.

проблема заключается в соединении вызова, когда он аварийно завершает работу линии 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...