вторник, 8 апреля 2008 г.

Завершение программы при выходе из системы или EVT_QUERY_END_SESSION нам не всегда друг

Полюбуйтесь на это  - http://sourceforge.net/tracker/index.php?func=detail&aid=1428691&group_id=9863&atid=109863 . Багу больше 2x(!) лет, тянется еще с прошлого стабильного релиза. До сих пор не пофиксен. Status: Open.  А ведь есть специальные события даже  EVT_QUERY_END_SESSION и EVT_END_SESSION

Потратил полдня включая\выключая комп что бы найти приемлимый порядок команд для того что бы заставить его корректно выходить при выключении компа и сохранять настройки. И вчера уже собираясь выложить первую бету народу, обнаружил что под win2K не работает все равно. Мало того что не работает, так еще и подвисает при выходе. Сейчас опять буду е****я что бы работало везде.

4 комментария:

Alexei Vinidiktov комментирует...

Удалось полностью решить проблему?

Анонимный комментирует...

Неа:) Думал что победил. Решил просто сохранять данные - не пытаясь себя закрыть. У меня под XP, а также под виртальной вистой и W2К работало все. Зарелизил
.
Теперь выяснилось что под реальной двушкой все плохо - при шатдауне программа спрашивает пользователя "можно ли мне закрытся"... Не могу понять почему, вот сегодня буду ковырятся.

Толік комментирует...

в коментах написано, что уже пофиксали, но в старые версии фикс не перенесут, чтобы чужие воркэроунды не ломать.
Date: 2008-04-15 16:36
Sender: vadzProject

Should be fixed in r53186 of the trunk. I won't backport this in 2.8 as
people could have their own code to deal with this problem there already
and this could result in some unintended (but bad) interaction with it.

Анонимный комментирует...

угу, я сейчас слежу за дискуссией в майл листе.
Вообщем похоже винда прибивает процесс сразу после возврата из OnEndSession, так что кто неуспел тот опаздал:)
И еще у народа получается интересная последовательность вызовов:

I tested the code (realy log off/shut down system) and works fine.
The call stack:

MyApp::MyApp
MyFrame::MyFrame
MyApp::OnQueryEndSession
MyFrame::OnClose
MyApp::OnEndSession
MyApp::OnExit
MyFrame::~MyFrame

А я расчитывал что OnExit вызывается после деструктора окна... вообщем пока там бардак - самое лучше это руками все сохранять в MyApp::OnQueryEndSession и не пытатся закрыть приложение, все равно не получается.