Russian Qt Forum

Qt => Общие вопросы => Тема начата: Dmitry_Panoff от Сентябрь 12, 2005, 16:18



Название: Завершение работы приложения
Отправлено: Dmitry_Panoff от Сентябрь 12, 2005, 16:18
Обычная гуевая програ, написанная на Qt4 работает под win2000server. При завершении работы винды без закрытия самой проги, винда выдает сообщение, мол, приложение не отвечает и предлагает стандартый вопрос: подождать или завершить. В итоге винда виснет, в ожидании пока кто-нибудь нажмет "завершить". А хочется, чтобы она (прога) корректно завершала свою работу при перезагрузке винды без всяких вопросов. Как сделать?


Название: Завершение работы приложения
Отправлено: L.Marvell от Декабрь 01, 2005, 17:02
Меня тоже интересует. Вопрос остается открытым.


Название: Завершение работы приложения
Отправлено: Dendy от Декабрь 03, 2005, 18:15
Доброго вечора, любі друзі українці та усі інші!  :D  Спробую зачинити це питання.

Добре написана програма повинна добре зачинятися при завершенні сеансу. Для цього у 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 от Декабрь 05, 2005, 14:54
Дуже вдячний за розгорнуте пояснення :!:


Название: Завершение работы приложения
Отправлено: Dmitry_Panoff от Декабрь 06, 2005, 12:29
Dendy

То, что доктор прописал, спасибо...