Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как убить зависший процесс?


Автор: bmmshayan 18.12.2009, 09:46
Разрабатываю программу которая следит за приложением в отсутствие человека.
Программа иногда зависает, т.е. процессор на максимум и/или просто зависший процесс который нужно вручную убивать из диспетчера задач.

Имя процесса известно (т.е. суть не в переборе всех процессов)!

Как средствами Delphi это сделать?
Заранее спасибо.

Автор: Данкинг 18.12.2009, 11:15
Код


function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := 0;

  FSnapshotHandle := CreateToolhelp32Snapshot
  (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
  FProcessEntry32);

  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
    UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
    UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(OpenProcess(
      PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;

  CloseHandle(FSnapshotHandle);
end;

Автор: bmmshayan 18.12.2009, 11:30
Данкинг

Большое спасибо за функцию которая убивает процесс.
Но вот вопрос: Как мне узнать что процесс завис?
И убьет ли эта функция именно зависший не отвечающий процесс?

Автор: Данкинг 18.12.2009, 12:00
Цитата(bmmshayan @  18.12.2009,  11:30 Найти цитируемый пост)
Как мне узнать что процесс завис?

Не знаю, но боюсь, что на 100% ты всё равно это не определишь, поскольку часто бывает, что винда пишет "не отвечает", но программа на самом деле работает. smile

Добавлено через 26 секунд
Цитата(bmmshayan @  18.12.2009,  11:30 Найти цитируемый пост)
И убьет ли эта функция именно зависший не отвечающий процесс?

Да, должна.

Автор: Keeper89 18.12.2009, 13:49
Цитата(bmmshayan @  18.12.2009,  11:30 Найти цитируемый пост)
Как мне узнать что процесс завис?

ИМХО либо из другого приложения, либо в своем запустить отдельный поток на отслеживание зависания.

Автор: bmmshayan 18.12.2009, 15:01
Данкинг
Ну и на том спасибо! smile

Keeper89
Да в том то и дело что я слежу за другим приложением. Но не знаю как определять "зависание"...

Автор: Демо 18.12.2009, 15:34
Цитата(bmmshayan @  18.12.2009,  15:01 Найти цитируемый пост)
Да в том то и дело что я слежу за другим приложением. Но не знаю как определять "зависание"...


Если тебе известна логика работы приложения, то можно ослеживать время его активности и дополнительно проверять, отвечает ли оно на SendMessage (GetProcessTimes + SendMessage).

Автор: bmmshayan 18.12.2009, 16:44
Ну а хотябы как узнать % нагрузки программой на процессор момент проверки?

Автор: Демо 18.12.2009, 17:20
Цитата(bmmshayan @  18.12.2009,  16:44 Найти цитируемый пост)
Ну а хотябы как узнать % нагрузки программой на процессор момент проверки?


Для этого тебе весь список процессов анализировать нужно.

Автор: dvamaster 22.12.2009, 08:32
EndTask

в хелпе есть, а в модулях не декларирована

Автор: Rennigth 22.12.2009, 09:32
Цитата(bmmshayan @  18.12.2009,  16:44 Найти цитируемый пост)
Ну а хотябы как узнать % нагрузки программой на процессор момент проверки? 

А если процесс завис на бесконечном цикле?  smile 
Демо прав, надо организовывать какой-нить KeepAlive.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)