wxProgressDialog как-то поддерживать приложение в живых после смерти? - PullRequest
3 голосов
/ 29 июля 2011

У меня странная проблема с wxWidgets. У меня есть следующий код

MyFrame::OnDoSomeLongThing(...) {
    progScreen = new wxProgressDialog(text,text,number,this,wxPD_AUTO_HIDE); // wxProgressDialog *progScreen is class member
    doPartOfThing() // calls the update method at the end of it
    ....
    doLastPartOfThing() // again calls update method that pushes value to 100/100
    progScreen->Destroy();
}

MyFrame::update() {
    progScreen->Update(newValue);
}

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

Однако только использование диалогового окна прогресса как-то продлевает срок службы приложения. Я пробовал Destroy (), я пытался просто «удалить progScreen», и то и другое каждый раз: я закрою основной фрейм, процесс продолжится и в какой-то момент выйдет с каким-то астрономическим номером. Единственное, что я мог бы подумать, может быть уместным, это то, что методы doPartsOfThings могут вызывать boost :: this_thread :: sleep, потому что это включает ожидание и все остальное в моем классе модели. Но это не должно иметь какое-либо отношение к моей проблеме. Или, может быть, это ... РЕДАКТИРОВАТЬ: я хочу подчеркнуть, что progScreen-> Update () вызывается из основного потока (GUI).

Итак, я спрашиваю, правильно ли я использую wxProgressDialog? Если нет, то как его использовать?

Спасибо за вашу помощь!

EDIT:

Ну ... получается, что удаление wxPD_AUTO_HIDE решило проблему. Я все еще не совсем уверен, в чем проблема, но диалог даже все еще ведет себя как прежде. Приложение закрывается, как и ожидалось.

1 Ответ

0 голосов
/ 30 июля 2011

Я думаю, что вам нужно переопределить метод wxApp, который закрывает приложение, чтобы он закрывал объект wxProgressDialog до его закрытия.

wxApp :: OnExit

virtual int OnExit ()

Переопределить эту функцию-член для любой обработки, которая должна быть сделано, поскольку приложение собирается выйти. OnExit вызывается после уничтожение всех окон и элементов управления приложения, но до wxWidgets очистки. Обратите внимание, что он не вызывается вообще, если сбой OnInit.

Возвращаемое значение этой функции в настоящее время игнорируется, возвращает то же самое значение, которое возвращается методом базового класса, если вы переопределите его.

Вам понадобится что-то вроде, если предположить, что progScreen является публичным атрибутом вашего фрейма

int myApp::OnExit()
{
  (MyFrame*)(GetTopWindow())->progScreen->Destroy()
  return wxApp::OnExit();
}
...