Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сообщение при прерывании процесса [D6, WinXP]


Страницы:   1 2

webpauk ©   (2005-08-14 16:12:00) 

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


Leonid Troyanovsky   (2005-08-15 17:27:00) [1]


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

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


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

--
Regards, LVT.


alpet   (2005-08-15 17:01:00) [2]

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

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


Leonid Troyanovsky   (2005-08-15 16:53:00) [3]


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

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


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

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

--
Regards, LVT.


alpet   (2005-08-15 16:47:00) [4]

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

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


Leonid Troyanovsky   (2005-08-15 16:44:00) [5]


> 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:32:00) [6]

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

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


Leonid Troyanovsky   (2005-08-15 16:22:00) [7]


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

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


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

--
Regards, LVT.


Leonid Troyanovsky   (2005-08-15 16:15:00) [8]


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

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


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

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

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

--
Regards, LVT.


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


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


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


alpet   (2005-08-15 16:01:00) [10]

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

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


Leonid Troyanovsky   (2005-08-15 15:55:00) [11]


> 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.


Alexander Panov   (2005-08-15 15:46:00) [12]

alpet ©   (15.08.05 15:44) [25]

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


alpet   (2005-08-15 15:44:00) [13]

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

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


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

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


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


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


RTFM: msdn WM_QUERYENDSESSION.

--
Regards, LVT.


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

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


Leonid Troyanovsky   (2005-08-15 13:59:00) [17]


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

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


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


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


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

--
Regards, LVT.


tesseract   (2005-08-15 13:31:00) [18]

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

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

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


Leonid Troyanovsky   (2005-08-15 11:50:00) [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.


Leonid Troyanovsky   (2005-08-15 11:40:00) [20]


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


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

--
Regards, LVT.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо