Форум: "WinAPI";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
ВнизЗавершение работы Windows Найти похожие ветки
← →
Интересующийся (2007-03-09 08:52) [0]Всем доброе время суток!
Подскажите как отловить завершение работы ОС из моей проги или попытку пользователя снять прогу нестандартным способом?
← →
Сергей М. © (2007-03-09 09:19) [1]
> из моей проги
Смотря что за "прога" - GUI, консоль, сервис ...
> попытку пользователя снять прогу нестандартным способом
Никак.
← →
Интересующийся (2007-03-09 09:42) [2]> Сергей М. © (09.03.07 09:19) [1]
> Смотря что за "прога" - GUI, консоль, сервис ...
Обычная фора (GUI как видно).
SYSCOMMAND отловить наверно нужно, но с каким параметром?
← →
Сергей М. © (2007-03-09 09:44) [3]
> Обычная фора (GUI как видно)
Тогда лови WM_QUERYENDSESSION
← →
Интересующийся (2007-03-09 10:12) [4]> Сергей М. © (09.03.07 09:44) [3]
> Тогда лови WM_QUERYENDSESSION
А поподробней об WM_QUERYENDSESSION можно, а то я ееотловить не могу?
← →
Сергей М. © (2007-03-09 10:21) [5]Все уже "отловлено".
Тебе остается только в обработчике события OnCloseQuery гл.формы написать
CanClose := True
А, собственно, зачем отслеживать момент завершения работы ОС ?
← →
Интересующийся (2007-03-09 10:55) [6]Прога должна корректно данные сохранить и в лог инфу записать почему и когда ее выгрузили.
Комп работает под управление APC, который при отключении питания держет комп необходимое время (по истечению которого происходит завершение работы ОС).
← →
Сергей М. © (2007-03-09 10:59) [7]
> записать почему и когда ее выгрузили.
Ну с "когда выгрузили" - это еще понятно.
А зачем нужно знать "почему выгрузили" ?
Если алгоритм "проги" в принципе не препятствует ее "выгрузке", то не все ли равно, кто явился инициатором ее завершения - то ли юзер, то ли сама ОС ?
← →
Интересующийся (2007-03-09 10:59) [8]Само завершение работы ОС отлавливается этим кодом:
Procedure TFMISDiana.WMENDSESSION(var Message:TMessage);
Begin
inherited;
if Message.WParam=1 then Close;//Вырубаем прогу
End;
← →
Сергей М. © (2007-03-09 11:01) [9]
> if Message.WParam=1 then Close;//Вырубаем прогу
Это вообще лишняя строчка.
← →
Интересующийся (2007-03-09 11:04) [10]> Сергей М. © (09.03.07 10:59) [7]
Невдаваясь в подробности скажу, что по алгоритму работы проги нужно знать причину завершения задачи.
К примеру если выгрузили по требованию юзира, скорей всего все задания на этот момент были выполнены. Чего при отключении по требованию ОС могло и непроизойти. Тогда нужно доделать работу или исправить возможные ошибки.
← →
Интересующийся (2007-03-09 11:06) [11]> if Message.WParam=1 then Close;//Вырубаем прогу
Взято из примера, но как я понимаю можно поставить свою обработку
← →
Сергей М. © (2007-03-09 11:18) [12]
> К примеру если выгрузили по требованию юзира
А если юзер (а не UPS) инициировал завершение работы ОС ?
← →
Интересующийся (2007-03-09 11:34) [13]>Интересующийся (09.03.07 11:04) [10]
>К примеру если выгрузили по требованию юзера, скорей всего все задания на этот момент были выполнены.
Мало какой юзер будет вырубать прогу при незавершенной задаче, хотя и такое возможно.
Хотя даже в таком случае юзер завершит прогу стандартными способами (Ctrl+Alt+Del к ним не относятся)... :)
← →
Интересующийся (2007-03-09 11:43) [14]Вместе с WM_ENDSESSION можно использовать WM_QUERYENDSESSION которая передается программе перед завершение работы или сменой пользователя.
Дополнительный вопрос:
Как в обработке WM_QUERYENDSESSION вернуть 0, объяснив системе что прога еще неготова к завершению?
← →
Сергей М. © (2007-03-09 11:54) [15]
> Как в обработке WM_QUERYENDSESSION вернуть 0, объяснив системе
> что прога еще неготова к завершению?
Что значит "не готова" ? А если батарея в UPS находится на последнем издыхании ?
← →
S@shka © (2007-03-09 12:35) [16]
> А если батарея в UPS находится на последнем издыхании
Пусть терпит!
← →
Интересующийся (2007-03-09 13:16) [17]Насколько я понял из описания обработка WM_QUERYENDSESSION может выполнять небольшие по продолжительности веши.
← →
Сергей М. © (2007-03-09 13:30) [18]
> Интересующийся (09.03.07 13:16) [17]
Вот именно.
И теперь предствь себе - твоя "прога", получив WM_QUERYENDSESSION, обязана максимально быстро обработать событие и вернуть TRUE ("я готова к завершению") или FALSE ("я не готова к завершению").
Система, не получив твоего согласия, вынуждена, в зависимости от условий инициации шатдауна, либо отказаться от шатдауна (а батарейка-то в UPS почти разряжена, на носу - мгновенное вынужденное обесточивание компа !) либо принудительно снять твой процесс с выполнения (действия ОС в этой ситуации вполне адекватны - принудительно снять "капризную прогу" с выполнения)
Твои действия ?
← →
Интересующийся (2007-03-09 13:57) [19]> Сергей М. © (09.03.07 13:30) [18]
ARC держит комп 5-15 минут, кажется этого времени хватит для всей обработки завершения работы проги.
В идеале хотелось бы получить сигнал от ARC, а не от ОС.
← →
Сергей М. © (2007-03-09 14:09) [20]
> кажется этого времени хватит для всей обработки завершения
> работы проги
Мало ли что тебе кажется)
> хотелось бы получить сигнал от ARC
Какой сигнал-то ? На завершение работы ОС что ли ? UPS не дает таких сигналов, ей абсолютно фиолетово, что будет делать ОС при том или ином состоянии оборудования бесперебойного питания. UPS лишь извещает ОС об изменениях своего состояния спецсигналами, а уж ОС сама принимает решение, выполнять ли ей шатдаун и просто извещать приложения об изменениях в UPS.
GUI-приложения, заинтересованные в отслеживании состояния подсистемы электропитания, должны обрабатывать сообщения WM_POWERBROADCAST.
← →
Интересующийся (2007-03-09 15:16) [21]> Сергей М. © (09.03.07 14:09) [20]
>GUI-приложения, заинтересованные в отслеживании состояния подсистемы >электропитания, должны обрабатывать сообщения WM_POWERBROADCAST.
пример работы с WM_POWERBROADCAST можно?
← →
Сергей М. © (2007-03-09 15:17) [22]Можно.
http://www.google.ru/search?q=DELPHI+WM_POWERBROADCAST&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a
← →
Интересующийся (2007-03-09 15:42) [23]Мой код, который неработает:
Protected
Procedure WMPOWERBROADCAST(var Message:TMessage); message WM_POWERBROADCAST;
............
Procedure TForm1.WMPOWERBROADCAST(var Message:TMessage);
Begin
inherited;
//Мой код
End;
← →
Сергей М. © (2007-03-09 15:47) [24]А WndProc() слабо перекрыть ?
← →
Интересующийся (2007-03-09 16:01) [25]> Сергей М. © (09.03.07 15:47) [24]
Да нет, а надо?
Думается мне, что WndProc() совсем сдесть непричем, да и в инфе которую я видел ничего про WndProc нет.
http://ww.delphimaster.net/view/11-1157936129/
← →
Сергей М. © (2007-03-09 16:31) [26]
> Интересующийся (09.03.07 16:01) [25]
> Думается мне, что WndProc() совсем сдесть непричем
да неужели ?!
← →
Интересующийся (2007-03-09 17:10) [27]А что туда писать нужно?
← →
Сергей М. © (2007-03-12 09:35) [28]procedure TMyMainForm.WndProc(var Message: TMessage);
begin
if Message.Msg = WM_ WM_POWERBROADCAST then
ShowMessage("Ура ! Поймал !");
inherited WndProc(Message);
end;
← →
DC-AC (2007-03-14 16:10) [29]19: У APC можно поймать сигнал "Low Battery". Как это сделать - смотря какой APC и смотря по какому интерфейсу (Simple Signaling, Smart Signaling) работает. Подробнее - можешь написать мне на почту.
← →
SLoW.AlfaMoon.Com (2007-03-22 17:47) [30]При терминации посредством ZwShutdownSystem не поможет ничего.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.09.09;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.067 c