Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Вниз

Сообщение при прерывании процесса   Найти похожие ветки 

 
webpauk   (2005-08-14 16:12) [0]

Подскажите посылвется ли какое-либо сообщение приложению при насильственном прерывании процесса через диспетчер задач.


 
TUser ©   (2005-08-14 16:16) [1]

Посылается, но если на него приложение не отреагирует - его завершат насильно.


 
webpauk   (2005-08-14 16:35) [2]

Какое?


 
tesseract ©   (2005-08-14 16:45) [3]

Как правило WM_QUERY_END_SESSION или WM_QUIT. Если в течении некоторого времени (если не изменялись настройки винды по этому поводу) процесс быкует то просто освобождается занятая им память.


 
alpet ©   (2005-08-14 16:48) [4]

1. WM_DESTROY
2. WM_SYSCOMMAND, wParam = SC_CLOSE

При завершении процесса, на вкладке "процессы" (на не "приложение"), сообщения не посылаются, поскольку считается что процесс "висит".


 
tesseract ©   (2005-08-14 16:55) [5]

WM_DESTROY - посылается только ОКНУ, а не процессу как и WM_SYSCOMMAND c SC_CLOSE.

Чтобы реально выяснить поставь точку останова на цикле обработки сообщений ( только данных сообщений а то начнёшь понимать оленеводов в процессе геноцида блох вручную). и закрой процесс в диспетчере задач.


 
Alexander Panov ©   (2005-08-14 16:56) [6]

alpet ©   (14.08.05 16:48) [4]
При завершении процесса, на вкладке "процессы" (на не "приложение"), сообщения не посылаются


Разве?


 
webpauk   (2005-08-14 16:58) [7]


> tesseract ©   (14.08.05 16:45) [3]


> alpet ©   (14.08.05 16:48) [4]

прежде чем советовать неплохо бы самому проверить


 
alpet ©   (2005-08-14 17:00) [8]

Alexander Panov ©   (14.08.05 16:56) [6]

Я пробывал ловить:

{ msgr.dpr }
uses Windows, Messages;
var msg: tagMsg;
    t: text;

begin
AssignFile (t, "c:\temp\log.txt");
Rewrite(t);
while GetMessage (msg, 0, 0, 0) do
begin
 case msg.message of
  WM_QUIT:
    WriteLn (t, "Msg: WM_QUIT");
  WM_ENDSESSION:
    WriteLn (t, "Msg: WM_ENDSESSION");
  else
    WriteLn (t, "Msg: ", msg.message);
 end;
 Flush (t);
end;
CloseFile (t);
end.

С первой вкладки - сообщение таки приходило - $C096. С второй - при принудительном завершении, нет, равно как и при использовании
taskkill /IM msgr.exe /F

Попробую сейчас также с гуевыми процессами.


 
tesseract ©   (2005-08-14 17:08) [9]

>>>Alexander Panov

Дядя Саша я твёрдо знаю что WM_QUIT посылается в основной цикл обработки сообщений приложения по любому (если только не kill через ProcessExporer).
 WM_ENDSESSION послыается после WM_QUERYENDSESSION.
Из Win32 api help >>
The WM_QUERYENDSESSION message is sent when the user chooses to end the Windows session or when an application calls the ExitWindows function. If any application returns zero, the Windows session is not ended. Windows stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.

The WM_QUIT message indicates a request to terminate application


 
webpauk   (2005-08-14 17:14) [10]


> tesseract ©   (14.08.05 17:08) [9]
> >>>Alexander Panov

Break!!!

Короче, кто знает чего посылается при завершении процесса из диспетчера


 
tesseract ©   (2005-08-14 17:27) [11]

Ни фига оказывается не посылается. 15 минут убил.

При выходы из винды - WM_QUERYENDSESSION при убийстве процесса просто он убивается и всё.
при завершении через TaskManager - WM_QUIT а за ним WM_Destroy главному окну.
Кстати в цикле обработки сообщений Tappication обрабатывается только WM_QUIT.


 
webpauk   (2005-08-14 17:32) [12]


> tesseract ©   (14.08.05 17:27) [11]

спасибо за бесцельно потраченное время! 8-)


 
alpet ©   (2005-08-14 17:35) [13]


uses Windows, Messages, SysUtils;
var msg: tagMsg;
    t: text;
   hWnd: THandle;

begin
hWnd := CreateWindow ("Edit", "Aoyoka",
       ES_MULTILINE or WS_SYSMENU or WS_VISIBLE,
       CW_USEDEFAULT, CW_USEDEFAULT,
       200, 200, 0, 0, hInstance, nil);
AssignFile (t, "c:\temp\log.txt");
Rewrite(t);
{$I-}
while GetMessage (msg, 0, 0, 0) do
begin
 case msg.message of
    WM_CLOSE: WriteLn (t, "Msg: WM_QUIT");
  WM_DESTROY: WriteLn (t, "Msg: WM_DESTROY");
  WM_NCMOUSEMOVE .. WM_NCMBUTTONDBLCLK,
  WM_NCHITTEST, WM_MOUSEMOVE: Write (t, "*"); // non-client and mouse messages
  WM_QUIT:
   begin
    WriteLn (t, "Msg: WM_QUIT");
    break;
   end;
  WM_ENDSESSION:
    WriteLn (t, "Msg: WM_ENDSESSION");
  else
   begin
    WriteLn (t, format ("Msg: $%x", [msg.message]));
     if (msg.hwnd <> 0) then
      begin
       TranslateMessage (msg);
       DispatchMessage (msg);
       // if not IsWindow (hWnd) then break;
      end;
   end;    
 end;
 Flush (t);
end;
CloseFile (t);
end.


Вот и все. Никаких сообщений, тихая смерть.


 
tesseract ©   (2005-08-14 17:42) [14]

Не зачто, сам от души порезвился. Оказывается не зря винда говорит что не к добру процесс завершать.


 
Игорь Шевченко ©   (2005-08-15 10:18) [15]

Alexander Panov ©   (14.08.05 16:56) [6]


> Разве?


А если задасться вопросом, кому Task Manager будет посылать сообщение при завершении процесса из списка процессов, то ответ придет сам собой.


 
Игорь Шевченко ©   (2005-08-15 10:19) [16]


> Короче, кто знает чего посылается при завершении процесса
> из диспетчера


Согласно правил грамматики русского языка, предложение со слова "короче" не начинается.


 
Leonid Troyanovsky ©   (2005-08-15 11:33) [17]


> tesseract ©   (14.08.05 16:45) [3]
> Как правило WM_QUERY_END_SESSION или WM_QUIT. Если в течении
> некоторого времени (если не изменялись настройки винды по
> этому поводу) процесс быкует то просто освобождается занятая
> им память.


WM_CLOSE. Окну, которое отображается на таскбаре.
И не "освобождается занятая память", а терминируется процесс,
после подтверждения в диалоге EndTask.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-08-15 11:40) [18]


> tesseract ©   (14.08.05 16:55) [5]
> WM_DESTROY - посылается только ОКНУ, а не процессу как и


Посылается окну своего потока.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-08-15 11:50) [19]


> alpet ©   (14.08.05 17:35) [13]

> hWnd := CreateWindow ("Edit", "Aoyoka",
>        ES_MULTILINE or WS_SYSMENU or WS_VISIBLE,
>        CW_USEDEFAULT, CW_USEDEFAULT,
>        200, 200, 0, 0, hInstance, nil);
..
> while GetMessage (msg, 0, 0, 0) do
> begin
>  case msg.message of
>     WM_CLOSE: WriteLn (t, "Msg: WM_QUIT");
>   WM_DESTROY: WriteLn (t, "Msg: WM_DESTROY");
>   WM_NCMOUSEMOVE .. WM_NCMBUTTONDBLCLK,
>   WM_NCHITTEST, WM_MOUSEMOVE: Write (t, "*"); // non-client
> and mouse messages
>   WM_QUIT:
>    begin
>     WriteLn (t, "Msg: WM_QUIT");
>     break;
>    end;
>   WM_ENDSESSION:
>     WriteLn (t, "Msg: WM_ENDSESSION");
>   else
>    begin
>     WriteLn (t, format ("Msg: $%x", [msg.message]));
>      if (msg.hwnd <> 0) then
>       begin
>        TranslateMessage (msg);
>        DispatchMessage (msg);
>        // if not IsWindow (hWnd) then break;
>       end;
>    end;    
>  end;


 Ужасно.

--
Regards, LVT.


 
tesseract ©   (2005-08-15 13:31) [20]

>> И не "освобождается занятая память", а терминируется процесс,

освобождается вся память, включая ту, где исполнимый код процесса. освобождаются занятые процессом дескипторы и тд. это и называется "терминация".

>> WM_CLOSE. Окну, которое отображается на таскбаре.
закрытие окна на таскбаое не означает закрытие приложения, если конечно оно у приложения вообще есть.


 
Leonid Troyanovsky ©   (2005-08-15 13:59) [21]


> tesseract ©   (15.08.05 13:31) [20]
> >> И не "освобождается занятая память", а терминируется
> процесс,

> освобождается вся память, включая ту, где исполнимый код
> процесса. освобождаются занятые процессом дескипторы и тд.
> это и называется "терминация".


RTFM: msdn TerminateProcess {что называется терминируется процесс}


> закрытие окна на таскбаое не означает закрытие приложения,
> если конечно оно у приложения вообще есть.


И что?
Можно подумать, что "как правило WM_QUERY_END_SESSION"
может что-то иное.

--
Regards, LVT.


 
tesseract ©   (2005-08-15 14:22) [22]

WM_QUERYENDSESSION - процесс не ответивший вовремя убивается на месте.


 
Leonid Troyanovsky ©   (2005-08-15 14:31) [23]


> tesseract ©   (15.08.05 14:22) [22]
> WM_QUERYENDSESSION - процесс не ответивший вовремя убивается
> на месте.


RTFM: msdn WM_QUERYENDSESSION.

--
Regards, LVT.


 
tesseract ©   (2005-08-15 14:48) [24]

>>RTFM: msdn WM_QUERYENDSESSION.
согласен RTFM


 
alpet ©   (2005-08-15 15:44) [25]

Leonid Troyanovsky ©   (15.08.05 11:50) [19]

Что-так, безаппеляционно :) ?


 
Alexander Panov ©   (2005-08-15 15:46) [26]

alpet ©   (15.08.05 15:44) [25]

Сомнения возникли, собственно, из-за того что некая программа не так давно при убивании процесса из панели задач реагировала корректно на свое жестокое завершщение, обрабатывая этот момент.


 
Leonid Troyanovsky ©   (2005-08-15 15:55) [27]


> alpet ©   (15.08.05 15:44) [25]
> Leonid Troyanovsky ©   (15.08.05 11:50) [19]

> Что-так, безаппеляционно :) ?


Найди 10 отличий, скажем от

http://podgoretsky.com/ftp/Language/nps/ru.delphi.html#N141

Отсюда и незамечаемость WM_CLOSE, которое, почему-то,
обозвано "WM_QUIT", см. также


> Alexander Panov ©   (15.08.05 15:46) [26]


Да и, вообще, окно EDIT без парента выглядит ужасно.

--
Regards, LVT.


 
alpet ©   (2005-08-15 16:01) [28]

Leonid Troyanovsky ©   (15.08.05 15:55) [27]

Сбился со счету, где-то на 30.
Так или иначе сообщения ловяться все, просто некоторые выводятся в лог, как цифры. И потом код, как-бы криво и не традионно (для кого-то даже видимо извращенно - просто я привык срезать углы в программировании там где не запрещенно) он не был написан, потверждает в целом что сообщение самому процессу, о предстоящей терминации не отправляется. Вот хотелось бы узнать от гуру поподробнее (или ссылку хотя-бы), как выполняется сам процесс терминации процесса, от чего в целом зависит время, которое проходит от выполнения TerminateProcess (или TerminateThread по отношению к последнему потоку процесса), до удаления обьекта ядра "процесс".


 
Игорь Шевченко ©   (2005-08-15 16:11) [29]


> как выполняется сам процесс терминации процесса


Освобждается объект ядра "процесс" и все объекты "поток", относящиеся к данному процессу, все остальное - побочные эффекты.


 
Leonid Troyanovsky ©   (2005-08-15 16:15) [30]


> alpet ©   (15.08.05 16:01) [28]

> написан, потверждает в целом что сообщение самому процессу,
> о предстоящей терминации не отправляется.


Дык, как же не отправляется? Мы ведь про закладку Applications.
А там отправляется WM_CLOSE.
Но, заметь, если, скажем у блокнота будет показан диалог About.
то ТМ скажет, что блокнот не отвечает, предлагая его терминировать.

Механизм этого дела мне не известен, предположительно
это посылка SendMessageTimeout with SMTO_ABORTIFHUNG.
Ну, а если любопыства не удовлетворено можно справиться
даже с исходниками windows - function EndTask.

Ну, а возиться с каждым потоком после того, IMHO,
системе незачем: TerminateProcess и все дела.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-08-15 16:22) [31]


> alpet ©   (15.08.05 16:01) [28]

> время, которое проходит от выполнения TerminateProcess (или
..
> до удаления обьекта ядра "процесс".


Времени может пройти и очень много, если кто-то удерживает
открытый хендл.

--
Regards, LVT.


 
alpet ©   (2005-08-15 16:32) [32]

Вот в чем оказывается моя ошибка. Я то имел ввиду именно вкладку процессы (см. вопрос [6]), будучи практически уверен, что действуя из нее к процессу буду применены наверняка OpenProcess и TerminateProcess.
Что касается времени завершения - оно как где-то прочитал, может зависеть от того чем собственно занимается главный поток процесса, и некоторые действия что не дадут ему завершиться мгновенно (например очень долгий или вызов драйвера, хотя я не проверял, утверждать наверняка не стану).

По сабжу дабы отловить момент действительного завершения процесса, сообщения не нужны - достаточно запустить дополнительный процесс, который будет заниматься ожиданием завершения исходного процесса с помощью WaitForSingleObject. Все остальные способы имхо нестоль эффективны.


 
Leonid Troyanovsky ©   (2005-08-15 16:44) [33]


> alpet ©   (15.08.05 16:32) [32]

> процесса, сообщения не нужны - достаточно запустить дополнительный
> процесс, который будет заниматься ожиданием завершения исходного
> процесса с помощью WaitForSingleObject. Все


Достаточно дополнительного потока.
Хотя, и поток необязателен - для GUI, IMHO, уважаемый Digitman
приводил недавно код для ожидания пары хендлов.
Или, например

http://groups-beta.google.com/group/fido7.ru.delphi.chainik/msg/c355993ba823b53c

Кстати, я бы еще один вывод добавил: приложение должно корректно
обрабатывать WM_CLOSE.

--
Regards, LVT.


 
alpet ©   (2005-08-15 16:47) [34]

Leonid Troyanovsky ©   (15.08.05 16:44) [33]

Помоему без дополнительного процесса как раз не обойтись (если только не внедрять свой код в существующий процесс). Ведь когда искомое событие наступит (обьект ядра "процесс" уничтожен) его надо будет где-то ловить, уж никак в самом завершенном процессе.


 
Leonid Troyanovsky ©   (2005-08-15 16:53) [35]


> alpet ©   (15.08.05 16:47) [34]

> Помоему без дополнительного процесса как раз не обойтись
> (если только не внедрять свой код в существующий процесс).
> Ведь когда искомое событие наступит (обьект ядра "процесс"
> уничтожен) его надо будет где-то ловить, уж никак в самом
> завершенном процессе.


Еще раз - объект будет уничтожен после закрытия последнего хендла.

Конечно, у процессов нет загробной жизни после TerminateProcess
(RTFM).
Т.е., подобное уведомление может получить лишь другой процесс.
Если он будет ждать в потоке - код проще, но можно и без дополнительного потока.

--
Regards, LVT.


 
alpet ©   (2005-08-15 17:01) [36]

Leonid Troyanovsky ©   (15.08.05 16:53) [35]

Сорри, тогда я просто не понял, что означает "достаточно дополнительного потока", для ожидания терминации процесса (есть ведь вероятность что ожидающий поток будет закрыт раньше самого процесса).


 
Leonid Troyanovsky ©   (2005-08-15 17:27) [37]


> alpet ©   (15.08.05 17:01) [36]

> Сорри, тогда я просто не понял, что означает "достаточно
> дополнительного потока", для ожидания терминации процесса
> (есть ведь вероятность что ожидающий поток будет закрыт
> раньше самого процесса).


Ну, если нудно объяснять(в конце раб. дня), то я
даже всерьез и не обсуждал жизнь после смерти,
т.е., мне казалось очевидным (RTFM), что ожидать возможно
лишь в другом процессе.
Т.е., если такое уведомление нужно, то это - в другом процессе.

--
Regards, LVT.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.021 c
2-1125055920
KyRo
2005-08-26 15:32
2005.10.09
Как отслеживать первую запись ?


4-1123656765
Aldor
2005-08-10 10:52
2005.10.09
Можно ли создавать свои объекты ядра?


8-1116324008
slim
2005-05-17 14:00
2005.10.09
direct draw. определение устройств и видеорежимов


14-1126857838
ocean
2005-09-16 12:03
2005.10.09
Упрямство


2-1125672528
Гость22
2005-09-02 18:48
2005.10.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский