QueryEndSession - как чуток подождать?..
От: Vladimyr  
Дата: 25.03.05 21:25
Оценка:
Всем добрый день, посоветуйте, как правильно использовать
обработчик OnQueryEndSession?

Мне нужно притормозить завершение работы Windows XP
на несколько секунд, пока моя программа доделает свои дела
С большим удивлением заметил, что это не так-то просто!
Установка в обработчике Accept := false полностью
прерывает процесс Shutdown'а, а использование цикла ожидания типа

while Some_Custom_Flag do Sleep (100); Accept := true;

не приостанавливает выполнение процесса — программа всё равно
закрывается!

Прервать Shutdown, а потом инициировать его самому ещё раз,
непросто по причине того, тогда нужно как-то определить, что же
это было — выключение компьютера или перезагрузка.
Re: QueryEndSession - как чуток подождать?..
От: Oleg_SK  
Дата: 21.04.05 21:33
Оценка:
Здравствуйте, Vladimyr, Вы писали:

V>Всем добрый день, посоветуйте, как правильно использовать

V>обработчик OnQueryEndSession?

V> Мне нужно притормозить завершение работы Windows XP

V>на несколько секунд, пока моя программа доделает свои дела

А разве нельзя сделать так, чтобы свои дела программа в этом случае доделывала в отдельном потоке? При обработке события OnQueryEndSession нужно создать поток, который будет этим заниматься, после чего можно уснуть до окончания его работы с помощью функции WaitForSingleObject...
Re: QueryEndSession - как чуток подождать?..
От: Pavel Dvorkin Россия  
Дата: 22.04.05 05:30
Оценка:
Здравствуйте, Vladimyr, Вы писали:

V>Всем добрый день, посоветуйте, как правильно использовать

V>обработчик OnQueryEndSession?

V> Мне нужно притормозить завершение работы Windows XP

V>на несколько секунд, пока моя программа доделает свои дела
V>С большим удивлением заметил, что это не так-то просто!
V>Установка в обработчике Accept := false полностью
V>прерывает процесс Shutdown'а, а использование цикла ожидания типа

V>while Some_Custom_Flag do Sleep (100); Accept := true;


V>не приостанавливает выполнение процесса — программа всё равно

V>закрывается!

Попробуй обработать WM_ENDSESSION, которое придет после WM_QUERYENDSESSION. Это как раз то место, где положено выполнять всякие закрывающие действия. Можно даже диалог открыть и пользователя спросить. А WM_QUERYENDSESSION не обрабатывай вообще, оно просто отвечает, согласен ты или нет закрыться.

V> Прервать Shutdown, а потом инициировать его самому ещё раз,

V>непросто по причине того, тогда нужно как-то определить, что же
V>это было — выключение компьютера или перезагрузка.
With best regards
Pavel Dvorkin
Re[2]: QueryEndSession - как чуток подождать?..
От: Кодёнок  
Дата: 25.04.05 09:14
Оценка:
PD>Попробуй обработать WM_ENDSESSION, которое придет после WM_QUERYENDSESSION. Это как раз то место, где положено выполнять всякие закрывающие действия. Можно даже диалог открыть и пользователя спросить. А WM_QUERYENDSESSION не обрабатывай вообще, оно просто отвечает, согласен ты или нет закрыться.

У меня был багрепорт — если WM_ENDSESSION работает слишком долго, появляется окно "Программа не отвечает..." с прогрессбаром.

Так что лучший вариант — пересмотреть загрузку/хранение данных так, чтобы большие объёмы (>10 мегабайт) не держать в памяти почём зря.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.