Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.09.09;
Скачать: CL | DM;

Вниз

Завершение работы 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 вся ветка

Текущий архив: 2007.09.09;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.021 c
2-1187261863
Igor_34
2007-08-16 14:57
2007.09.09
interbase


3-1179160221
User_
2007-05-14 20:30
2007.09.09
Работа с файлами .mdf


2-1187073587
kolj
2007-08-14 10:39
2007.09.09
Как убрать програму с панели пуск ?


15-1187170981
Вася Правильный
2007-08-15 13:43
2007.09.09
снова про калаш


15-1187170265
Василий
2007-08-15 13:31
2007.09.09
Ищу favicon сайтов. :(