Сейчас на форуме: zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Закрыть программу Delphi
Посл.ответ Сообщение

Ранг: -0.1 (гость), 6thx
Активность: 0.010
Статус: Участник

Создано: 24 июля 2013 14:57
· Личное сообщение · #1

Приветствую

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

Code:
  1. function KillTask(ExeFileName: string): integer;
  2. const 
  3.  PROCESS_TERMINATE=$0001;
  4. var 
  5.  ContinueLoop: BOOL;
  6.  FSnapshotHandle: THandle;
  7.  FProcessEntry32: TProcessEntry32;
  8. begin 
  9.  result := 0;
  10.  
  11.  FSnapshotHandle := CreateToolhelp32Snapshot 
  12.  (TH32CS_SNAPPROCESS, 0);
  13.  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  14.  ContinueLoop := Process32First(FSnapshotHandle, 
  15.  FProcessEntry32);
  16.  
  17.  while integer(ContinueLoop) <> 0 do 
  18.  begin 
  19.  if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = 
  20.  UpperCase(ExeFileName)) 
  21.  or (UpperCase(FProcessEntry32.szExeFile) = 
  22.  UpperCase(ExeFileName))) then 
  23.  Result := Integer(TerminateProcess(OpenProcess( 
  24.  PROCESS_TERMINATE, BOOL(0), 
  25.  FProcessEntry32.th32ProcessID), 0));
  26.  ContinueLoop := Process32Next(FSnapshotHandle, 
  27.  FProcessEntry32);
  28.  end;
  29.  
  30.  CloseHandle(FSnapshotHandle);
  31. end;


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




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 24 июля 2013 15:04
· Личное сообщение · #2

Неужто сложно PID проверить на текущий? Что вообще такой топик делает на этом форуме?

| Сообщение посчитали полезным: SergeyIvan

Ранг: -0.1 (гость), 6thx
Активность: 0.010
Статус: Участник

Создано: 24 июля 2013 15:06
· Личное сообщение · #3

Archer

Сорри, да топик не по теме, но вроде в разделе программирование, покурю по поводу PID.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 24 июля 2013 15:12
· Личное сообщение · #4

SergeyIvan
Да чё там курить? GetCurrentProcessId() сравнивайте с тем, что в текущей TProcessEntry32, и если равны, то не вызывайте TerminateProcess для такого процесса.

-----
Stuck to the plan, always think that we would stand up, never ran.


| Сообщение посчитали полезным: SergeyIvan

Ранг: -0.1 (гость), 6thx
Активность: 0.010
Статус: Участник

Создано: 24 июля 2013 15:16
· Личное сообщение · #5

ARCHANGEL

Да как-то не доводилось иметь дело с PID-ами
За подсказки спасибо, все понял, счас кофейку приму и буду реализовывать.


 eXeL@B —› Программирование —› Закрыть программу Delphi
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати