Название: Отловить закрытие программы Отправлено: merke от Январь 14, 2011, 08:23 Всем привет!
Есть консольное приложение написанное под Windows. Нужно отловить грубое завершение программы например из диспетчера задач. Нужно при этом сохранить все имеющиеся данные в программе скинув их на жесткий диск. Куда рыть? Название: Re: Отловить закрытие программы Отправлено: GreatSnake от Январь 14, 2011, 09:14 Цитировать Нужно отловить грубое завершение программы например из диспетчера задач. Грубое завершение отловить невозможно.Название: Re: Отловить закрытие программы Отправлено: merke от Январь 14, 2011, 09:25 А класс QSessionManager это не то что мне нужно?
Название: Re: Отловить закрытие программы Отправлено: GreatSnake от Январь 14, 2011, 09:41 Во-первых, при "грубом" завершении ОС просто прибивает процесс. Процесс в этом случае о своей смерти уже никогда не узнает. К тому же, если бы вы были внимательны, то заметили, что диспетчер задач при попытке завершения процесса предупреждает о потере данных.
Во-вторых, разговор шел про "консольное приложение", а QSessionManager является частью QtGui. Название: Re: Отловить закрытие программы Отправлено: merke от Январь 14, 2011, 09:57 Спасибо это я сейчас уяснил!
Теперь следующее. Например пользователь выключает компьютер, винда пытается закрыть все запущенные программы и только потом завершает свою работу. Как в этом случае поступить? Я думаю что при выключении виндовс тупо не грохает процессы, а посылает какие то сообщения приложениям, или я ошибаюсь? В моей программе могут накопиться важные транзитные данные, которые любыми способами нужно уберечь. Ладно с диспетчером то всё ясно теперь. А как быть если юзер решил отрубить комп, а моя прога ещё не обработала все данные, ей нужно обязательно всё скинуть это во временные файлы. Название: Re: Отловить закрытие программы Отправлено: GreatSnake от Январь 14, 2011, 10:11 см. atexit() (http://msdn.microsoft.com/en-us/library/tze57ck3(v=vs.80).aspx) или signal() (http://msdn.microsoft.com/en-US/library/xdkz3x12(v=VS.80).aspx).
Название: Re: Отловить закрытие программы Отправлено: merke от Январь 14, 2011, 11:41 спасибо, потом почитаю. Пока нашел вот такой код:
Код
Но срабатывает только если по таймеру вызывается слот quit(). А если в консоле нажать к примеру ctrl+c или взять и завершить вындовс ни что не срабатывает.((( Название: Re: Отловить закрытие программы Отправлено: p166 от Январь 17, 2011, 15:07 void QMainWindow::closeEvent(QCloseEvent *event)
{ if (saveData()) event->accept(); else event->ignore(); } Windows при выключении посылает сигнал завершения для запущенных приложений, и ждет 20-40 секунд (точно не помню), за это время нужно успеть сохранить и корректно закрыть свое приложение. Название: Re: Отловить закрытие программы Отправлено: Goshman от Март 12, 2011, 08:58 Добрый день!
Есть програмка, которая должна при выходе (выключении компьютера) сохранять данные на диск. Использую для этого closeEvent(QCloseEvent *event) Система Ubuntu 10.04. В параметрах управления питанием во вкладке "Общие" при нажатии кнопки питания установил "Завершение работы" Собствено при нажатии на кнопку Power комп выключается и запись на диск не производится. При простом выходе из програмы все ОК. Куда копать? Название: Re: Отловить закрытие программы Отправлено: merke от Март 12, 2011, 09:46 Я думаю ловить сообщения от операционной системы, использовать API системы. Средствами Qt ни как...
Название: Re: Отловить закрытие программы Отправлено: Goshman от Март 12, 2011, 09:57 Я думаю ловить сообщения от операционной системы, использовать API системы. Средствами Qt ни как... Понятно, пойду мучить убунтушников :)Название: Re: Отловить закрытие программы Отправлено: merke от Март 12, 2011, 10:23 А хотя смотри:
Код: bool QApplication::x11EventFilter ( XEvent * event ) [virtual] Под виндой я сделал вот так: Код
Код
Название: Re: Отловить закрытие программы Отправлено: Fat-Zer от Март 12, 2011, 12:36 1) сигнал QCoreApplication::aboutToQuit ()
2) из стандартного с/с++ atexit() Название: Re: Отловить закрытие программы Отправлено: Goshman от Март 13, 2011, 08:27 Всем спасибо, чуть с делами разгребусь и попробую.
По результатам отпишусь. |