Russian Qt Forum

Qt => Общие вопросы => Тема начата: merke от Январь 14, 2011, 08:23



Название: Отловить закрытие программы
Отправлено: 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
спасибо, потом почитаю. Пока нашел вот такой код:

Код
C++ (Qt)
#include <QtCore/QtGlobal>
#include <QtCore/QtDebug>
#include <QtCore/QTimer>
#include <QApplication>
#include <QFile>
 
class MyObject : public QObject
{
   Q_OBJECT
public:
   MyObject(QObject* parent = 0) : QObject(parent)
   {
       QObject::connect(qApp, SIGNAL(aboutToQuit()), SLOT(onQuit()));
   }
   ~MyObject()
   {
 
   }
public slots:
   void onQuit()
   {
       QFile file("temp.txt");
       file.open(QIODevice::WriteOnly);
       file.write("ShutDown");
       file.flush();
       file.close();
 
   }
};
int main(int argc, char* argv[])
{
   QCoreApplication a(argc, argv);
   MyObject mo;
   //QTimer::singleShot(1000, qApp, SLOT(quit()));
   a.exec();
   qDebug() << "Shutdown";
   return 0;
}
 
#include "moc_main.cpp"
 

Но срабатывает только если по таймеру вызывается слот 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]

Под виндой я сделал вот так:

Код
C++ (Qt)
#ifndef MYAPPLICATION_H
#define MYAPPLICATION_H
 
#include <QApplication>
#include <QMessageBox>
#include <QDebug>
 
#include <qt_windows.h>
 
class MyApplication : public QApplication
{
public:
       MyApplication( int argc, char ** argv ) :
               QApplication( argc, argv )
       {
       }
       bool winEventFilter(MSG * msg, long * retVal)
       {
 
          // qDebug() << *msg;
               if (msg->message == WM_QUERYENDSESSION )
               {
                       QMessageBox::information( NULL, "Session End",
"Session End", "OK" );
                       *retVal = false;
                       return true;
               }
               return false;
       }
 
};
 
 
#endif // MYAPPLICATION_H



Код
C++ (Qt)
#include <QtGui/QApplication>
#include "mainwindow.h"
#include "MyApplication.h"
 
int main(int argc, char *argv[])
{
   MyApplication a(argc, argv);
   MainWindow w;
   w.show();
 
   return a.exec();
}



Название: Re: Отловить закрытие программы
Отправлено: Fat-Zer от Март 12, 2011, 12:36
1) сигнал QCoreApplication::aboutToQuit ()
2) из стандартного с/с++ atexit()


Название: Re: Отловить закрытие программы
Отправлено: Goshman от Март 13, 2011, 08:27
Всем спасибо, чуть с делами разгребусь и попробую.
По результатам отпишусь.