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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выключение программы при отключении компьютера  (Прочитано 4882 раз)
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« : Декабрь 20, 2011, 11:10 »

Есть приложение, которое висит в трее даже если ни одно из окон не открыто ( app.setQuitOnLastWindowClosed( false ); ).
Вопрос в том, как его правильно закрывать при отключении компьютера.

То есть я могу перегрузить у QApplication winEventFilter и поймать WM_QUERYENDSESSION или WM_ENDSESSION.
Наверняка и в других осях есть подобные события, но нет ли более кроссплатформенного решения?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Декабрь 20, 2011, 11:16 »

void QCoreApplication::aboutToQuit ()
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #2 : Декабрь 20, 2011, 11:29 »

Этот сигнал посылается, когда приложение собирается завершить цикл обработки событий, но дело-то как раз в том, что завершать его приложение и не думает, просто висит себе в трее, пока система не предложит просто жёстко прибить процесс.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Декабрь 20, 2011, 11:31 »

This may happen either after a call to quit() from inside the application or when the users shuts down the entire desktop session.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #4 : Декабрь 20, 2011, 11:59 »

This may happen either after a call to quit() from inside the application or when the users shuts down the entire desktop session.

Ну по крайней мере в винде с отключенным quitOnLastWindowClosed этого не происходит (подозреваю что и в других осях так же и описанный aboutToQuit испускается при завершении desktop session только потому, что закрываются все окна).
Записан
NicK
Гость
« Ответ #5 : Декабрь 20, 2011, 12:17 »

Только сегодня задался таким же вопросом.
Можно пробовать ловить системное сообщение о завершении работы ОС:
Вариант для Windows:

Код
C++ (Qt)
#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)
{
 
if (msg->message == WM_QUERYENDSESSION )
{
QMessageBox::information( NULL, "Session end", "Session end", "OK" );
*retVal = false;
return true;
}
return false;
}
 
};
 
 

Для Linux, к сожалению, не знаю. Надеюсь, кто-нибудь подскажет.
Записан
andrew.k
Гость
« Ответ #6 : Декабрь 20, 2011, 12:36 »

Под линукс нужно установить обработчик сигнала SIGTERM с помощью системного вызова signal
Записан
iroln
Гость
« Ответ #7 : Декабрь 20, 2011, 12:52 »

У меня есть программка, которая висит в трее и при выключении компьютера что-то пишет куда-то в лог. Давно писал, уже не помню детали.

Вот такая функция есть:
Код
C++ (Qt)
void Application::commitData(QSessionManager &sm)
{
   timewatcher->slotWriteDataTimeToFile(); // при завершении сеанса ОС пишем данные в файл отчёта
 
// DEBUG: проверка работы менеджера сессий
// FIXME: когда все окна приложения не видны, эта функция почему-то не
// вызывается при завершении работы системы.
//
//    if(sm.allowsInteraction()) {
//        int r = QMessageBox::warning(timewatcher, tr("TimeWatcher"),
//                                     tr("Bla-Bla-Bla.\n"
//                                        "Do you really want to quit?"),
//                                     QMessageBox::Yes | QMessageBox::No);
//        if (r == QMessageBox::Yes) {
//            sm.release();
//        }
//        else {
//            sm.cancel();
//        }
//    }
}

Это то, или у вас другая проблема?

UPD:
Ага, и флаг тоже стоит
Код
C++ (Qt)
Application::setQuitOnLastWindowClosed(false);

« Последнее редактирование: Декабрь 20, 2011, 12:56 от iroln » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #8 : Декабрь 20, 2011, 13:49 »

NicK, почти так у меня и сделно:
Код:
#ifdef Q_WS_WIN

#include <qt_windows.h>

bool ServerApplication :: winEventFilter( MSG *message, long *result )
{
    UINT& msg = message->message;
    if ( msg == WM_QUERYENDSESSION || msg == WM_ENDSESSION )
    {
        *result = 1;
        quit();
        return true;
    }
    return QApplication::winEventFilter( message, result );
}
#endif


Под линукс нужно установить обработчик сигнала SIGTERM с помощью системного вызова signal
Буду иметь в виду, хотя думаю через QApplication::*EventFilter для других осей примерно так же можно реализовать, просто хотелось некоторой универсальности.

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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