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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Завершение работы приложения  (Прочитано 5025 раз)
Dmitry_Panoff
Гость
« : Сентябрь 12, 2005, 16:18 »

Обычная гуевая програ, написанная на Qt4 работает под win2000server. При завершении работы винды без закрытия самой проги, винда выдает сообщение, мол, приложение не отвечает и предлагает стандартый вопрос: подождать или завершить. В итоге винда виснет, в ожидании пока кто-нибудь нажмет "завершить". А хочется, чтобы она (прога) корректно завершала свою работу при перезагрузке винды без всяких вопросов. Как сделать?
Записан
L.Marvell
Гость
« Ответ #1 : Декабрь 01, 2005, 17:02 »

Меня тоже интересует. Вопрос остается открытым.
Записан
Dendy
Гость
« Ответ #2 : Декабрь 03, 2005, 18:15 »

Доброго вечора, любі друзі українці та усі інші!  Веселый  Спробую зачинити це питання.

Добре написана програма повинна добре зачинятися при завершенні сеансу. Для цього у Qt є клас QSessionManager. Достукатися до нього ми можемо через віртуальні функції: QApplication::commitData( QSessionManager & ) та QApplication::saveState( QSessionManager & ). Під Windows працєю тільки перша віртуальна функція, бо у ньому немає реального менеджера сесій.

Код:
class MyApplication : public QApplication
{
...
  void commitData( QSessionManager & sm );
...
};

...

void MyApplication::commitData( QSessionManager & sm )
{
  if ( not_need_to_ask_user )
  {
    // програма може сама завершитися без втручання
    sm.release(); // даємо менеджеру можливість опитати інші програми сеансу, доки будемо сейвитися
    save_my_data();
  }
  else
  {
    // треба запитати у користувача, а чи дійсно він бажає завершувати сеанс
    if ( sm.allowsInteraction() )
    {
      // ми маємо змогу запитати
      int ret = QMessageBox::question( 0, "my program", "document not saved, save it?", QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel );
      if ( ret == QMessageBox::No )
        return;
      if ( ret == QMessageBox::Yes )
      {
        sm.release();
        save_my_document();
        return;
      }
      // ret == QMessageBox::Cancel, припиняємо завершення сеансу, працюємо далі
      sm.cancel();
    }
    else
    {
      // запитати ми неможемо, вимикаємося терміново
      sm.release();
      save_my_temp_document();
    }
  }
}

...

int main( int argc, char ** argv )
{
  MyApplication app( argc, argv );
...
  return app.exec();
}


Це тільки приклад Улыбающийся  Усім читати доку по QSessionManager та Session Management.
Записан
L.Marvell
Гость
« Ответ #3 : Декабрь 05, 2005, 14:54 »

Дуже вдячний за розгорнуте пояснення :!:
Записан
Dmitry_Panoff
Гость
« Ответ #4 : Декабрь 06, 2005, 12:29 »

Dendy

То, что доктор прописал, спасибо...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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