![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сообщение при прерывании процесса [D6, WinXP]
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.