Russian Qt Forum
Ноябрь 27, 2024, 18:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Отловить закрытие программы  (Прочитано 11722 раз)
merke
Гость
« : Январь 14, 2011, 08:23 »

Всем привет!

Есть консольное приложение написанное под Windows. Нужно отловить грубое завершение программы например из диспетчера задач. Нужно при этом сохранить все имеющиеся данные в программе скинув их на жесткий диск. Куда рыть?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Январь 14, 2011, 09:14 »

Цитировать
Нужно отловить грубое завершение программы например из диспетчера задач.
Грубое завершение отловить невозможно.
Записан

Qt 5.11/4.8.7 (X11/Win)
merke
Гость
« Ответ #2 : Январь 14, 2011, 09:25 »

А класс QSessionManager это не то что мне нужно?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Январь 14, 2011, 09:41 »

Во-первых, при "грубом" завершении ОС просто прибивает процесс. Процесс в этом случае о своей смерти уже никогда не узнает. К тому же, если бы вы были внимательны, то заметили, что диспетчер задач при попытке завершения процесса предупреждает о потере данных.
Во-вторых, разговор шел про "консольное приложение", а QSessionManager является частью QtGui.
Записан

Qt 5.11/4.8.7 (X11/Win)
merke
Гость
« Ответ #4 : Январь 14, 2011, 09:57 »

Спасибо это я сейчас уяснил!

Теперь следующее. Например пользователь выключает компьютер, винда пытается закрыть все запущенные программы и только потом завершает свою работу. Как в этом случае поступить? Я думаю что при выключении виндовс тупо не грохает процессы, а посылает какие то сообщения приложениям, или я ошибаюсь?

В моей программе могут накопиться важные транзитные данные, которые любыми способами нужно уберечь. Ладно с диспетчером то всё ясно теперь. А как быть если юзер решил отрубить комп, а моя прога ещё не обработала все данные, ей нужно обязательно всё скинуть это во временные файлы.
« Последнее редактирование: Январь 14, 2011, 10:05 от Александр » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Январь 14, 2011, 10:11 »

см. atexit() или signal().
Записан

Qt 5.11/4.8.7 (X11/Win)
merke
Гость
« Ответ #6 : Январь 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 или взять и завершить вындовс ни что не срабатывает.(((
Записан
p166
Гость
« Ответ #7 : Январь 17, 2011, 15:07 »

void QMainWindow::closeEvent(QCloseEvent *event)
{
    if (saveData())
        event->accept();
        else event->ignore();
}

Windows при выключении посылает сигнал завершения для запущенных приложений, и ждет 20-40 секунд (точно не помню), за это время нужно успеть сохранить и корректно закрыть свое приложение.
Записан
Goshman
Гость
« Ответ #8 : Март 12, 2011, 08:58 »

Добрый день!

Есть програмка, которая должна при выходе (выключении компьютера) сохранять данные на диск.
Использую для этого closeEvent(QCloseEvent *event)

Система Ubuntu 10.04. В параметрах управления питанием во вкладке "Общие" при нажатии кнопки питания установил "Завершение работы"
Собствено при нажатии на кнопку Power комп выключается и запись на диск не производится. При простом выходе из програмы все ОК.

Куда копать?

Записан
merke
Гость
« Ответ #9 : Март 12, 2011, 09:46 »

Я думаю ловить сообщения от операционной системы, использовать API системы. Средствами Qt ни как...
Записан
Goshman
Гость
« Ответ #10 : Март 12, 2011, 09:57 »

Я думаю ловить сообщения от операционной системы, использовать API системы. Средствами Qt ни как...
Понятно, пойду мучить убунтушников Улыбающийся
Записан
merke
Гость
« Ответ #11 : Март 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();
}

Записан
Fat-Zer
Гость
« Ответ #12 : Март 12, 2011, 12:36 »

1) сигнал QCoreApplication::aboutToQuit ()
2) из стандартного с/с++ atexit()
Записан
Goshman
Гость
« Ответ #13 : Март 13, 2011, 08:27 »

Всем спасибо, чуть с делами разгребусь и попробую.
По результатам отпишусь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.198 секунд. Запросов: 23.