Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1187074243
просто так
2007-08-14 10:50
2007.09.09
Про орешник


4-1173536327
Альберт
2007-03-10 17:18
2007.09.09
поймать событие перерисовки РЕГИОНА ПОД конкретным окном


3-1179236373
oleg__
2007-05-15 17:39
2007.09.09
Oracle через ADO


2-1187005933
Quart
2007-08-13 15:52
2007.09.09
индексация


2-1187083802
programmist87
2007-08-14 13:30
2007.09.09
Как записать текст в файл?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский