Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.24;
Скачать: CL | DM;

Вниз

Определение состояния процесса   Найти похожие ветки 

 
koha ©   (2007-06-03 17:14) [0]

Необходимо узнать процесс выполняется или нет?
Моя программа запускает процесс и получает его PID затем переодически проверяе состояния процесса через функцию:

function ProcessStatus(ProcessID: Integer): boolean;
Var HProcess: THandle;
begin
 HProcess:=OpenProcess(PROCESS_ALL_ACCESS,true,ProcessID);
 if HProcess = 0 then exit;
 Result:=true;
 CloseHandle(HProcess);
end;


- Но вот проблемка одна эта функция всегда возвращает True даже если процесс уже не существует.
 Как это исправить?


 
DrPass ©   (2007-06-03 17:46) [1]

WaitForSingleObject


 
Zagaevskiy ©   (2007-06-03 18:28) [2]


function ProcessStatus(ProcessID: Integer): boolean;
Var HProcess: THandle;
begin
 RESULT:=false;
 HProcess:=OpenProcess(PROCESS_ALL_ACCESS,true,ProcessID);
if HProcess = 0 then exit;
Result:=true;
CloseHandle(HProcess);
end;

Не поможет?


 
[Koha]   (2007-06-03 18:52) [3]


> DrPass ©   (03.06.07 17:46) [1]
> WaitForSingleObject


- Это совсем не то, разбираться же надо, что советуешь.
WaitForSingleObject - это приостановка родительского процесса, пока не завершится дочерний процесс, который, допустим должен завершиться от контрола родительского процесса перед этим уже замерзшего. И как продолжишь работу?


 
[Koha]   (2007-06-03 18:56) [4]


> Zagaevskiy ©   (03.06.07 18:28) [2]



> RESULT:=false;


- насколько я зраю это можно пропустить, так как переменная boolean всегда "инициирутся" с 0 - т.е. false;


 
Koha ©   (2007-06-03 19:03) [5]

Я уже и сам нашел некоторое решение:

function ProcessStatus(ProcessID: Integer): Longword;
Var HProcess: THandle;
begin
 HProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);
 if HProcess = 0 then exit;
 GetExitCodeProcess(HProcess, result);
 CloseHandle(HProcess);
end;


если ProcessStatus(ProcessID) = 0 то  дочерний процесс уже умер, а если <> 0 значит еще жив.


 
DrPass ©   (2007-06-03 19:24) [6]


> [Koha]   (03.06.07 18:52) [3]

Я-то разбираюсь в том, что советую. WaitForSingleObject - это остановка текущего потока до того момента, как истечет таймаут либо требуемый объект перейдет в сигнальное состояние. Для задачи "отследить момент завершения работы процесса" - идеальный вариант, куда лучше, чем тупо проверять его состояние каждые n миллисекунд.
А телепатировать, что там у кого на уме, мне как-то не хочется. Да и в общем-то безразлично :)


 
Koha ©   (2007-06-03 19:55) [7]


> DrPass ©   (03.06.07 19:24) [6]


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


 
DrPass ©   (2007-06-03 20:40) [8]


> Koha ©   (03.06.07 19:55) [7]

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


 
Однокамушкин   (2007-06-03 21:04) [9]


> Koha ©   (03.06.07 19:55) [7]
>
> > DrPass ©   (03.06.07 19:24) [6]
>
>
> - как ты говоришь мне и не нужно, так как в моей программе
> выполняется много просессов одновременно, а про то, что
> говоришь, хорошо для одного просесса: запустил, подождал
> когда завершится и далее работать стало,

Зачем ждать-то? Можно поставить нулевой таймаут, и тогда WaitForSingleObject отработает мгновенно и вернёт либо WAIT_TIMEOUT, если процесс не завершён, либо WAIT_OBJECT_0, если завершён... так что DrPass дело говорит, просто надо было заглянуть в хелп и почитать там про WaitForSingleObject... а вы, наверное, увидели пример её применения в одном случае и решили, что только так её и применяют...


 
Koha ©   (2007-06-03 22:22) [10]


> Однокамушкин   (03.06.07 21:04) [9]


я его понял прекрасно, очем он толковал, да он прав, конечно.
у меня есть подобная функция

function ExecAndWait(const FileName: string; const CmdShow: Integer): Longword;
var { by Pat Ritchey }
 zAppName: array[0..512] of Char;
 zCurDir: array[0..255] of Char;
 WorkDir: string;
 StartupInfo: TStartupInfo;
 ProcessInfo: TProcessInformation;
 AppIsRunning: DWORD;
begin
 StrPCopy(zAppName, FileName);
 GetDir(0, WorkDir);
 StrPCopy(zCurDir, WorkDir);
 FillChar(StartupInfo, SizeOf(StartupInfo), #0);
 StartupInfo.cb          := SizeOf(StartupInfo);
 StartupInfo.dwFlags     := STARTF_USESHOWWINDOW;
 StartupInfo.wShowWindow := CmdShow;
 if not CreateProcess(nil,
   zAppName, // pointer to command line string
   nil,      // pointer to process security attributes
   nil,      // pointer to thread security attributes
   False,    // handle inheritance flag
   CREATE_NEW_CONSOLE or // creation flags
   NORMAL_PRIORITY_CLASS,
   nil,         //pointer to new environment block
   nil,         // pointer to current directory name
   StartupInfo, // pointer to STARTUPINFO
   ProcessInfo) // pointer to PROCESS_INF
   then Result := WAIT_FAILED
 else
 begin
   while WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_TIMEOUT do
   begin
     Application.ProcessMessages;
     Sleep(50);
   end;
   {
   // or:
   repeat
     AppIsRunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
     Application.ProcessMessages;
     Sleep(50);
   until (AppIsRunning <> WAIT_TIMEOUT);
   }
   WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
   GetExitCodeProcess(ProcessInfo.hProcess, Result);
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
 end;
end;


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


 
Kedge ©   (2007-06-03 23:05) [11]

> [10] Koha ©   (03.06.07 22:22)
>мне нужен был не факт их завершения а просто наблюдение, что то навроде процесс-монитора.
А почему, просто, не делать переодически SnapShot ?


 
Eraser ©   (2007-06-03 23:08) [12]

> что то навроде процесс-монитора.

через wmi можно http://kladovka.net.ru/index.cgi?pid=board&rid=376


 
sniknik ©   (2007-06-04 02:19) [13]

> и как же сделать если несколько процессов?

const
 STARTED      = 1;
 CLOSED       = 2;
 TERM_NO_WAIT = 3;
 OBLOMS       = 4;

type
 TProcThread = class(TThread)
   FName: string;
   FState: PByte;
 protected
   procedure Execute; override;
 public
   constructor Create(const Name: string; State: PByte);
 end;

TForm1 = class(TForm)
   ...
   Proc: array[0..2] of byte;
   ...
 end;

constructor TProcThread.Create(const Name: string; State: PByte);
begin
 inherited Create(false);

 FreeOnTerminate:= true;
 FName := Name;
 FState:= State;
end;

procedure TProcThread.Execute;
var
 StInfo: TStartupInfo;
 PrInfo: TProcessInformation;
begin
 ZeroMemory(@StInfo, SizeOf(StInfo));
 StInfo.cb:= SizeOf(StInfo);

 if CreateProcess(nil, PChar(FName), nil, nil, false, 0, nil, nil, StInfo, PrInfo) then begin
   FState^:= STARTED;

   while (WaitForSingleObject(PrInfo.hProcess, 0) = WAIT_TIMEOUT) and not Terminated do
     Sleep(50);

   if Terminated
     then FState^:= TERM_NO_WAIT
     else FState^:= CLOSED;

   CloseHandle(PrInfo.hThread);
   CloseHandle(PrInfo.hProcess);
 end else
   FState^:= OBLOMS;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TProcThread.Create("sol.exe", @Proc[0]);
 TProcThread.Create("winmine.exe", @Proc[1]);
 TProcThread.Create("freecell.exe", @Proc[2]);
end;


 
Koha ©   (2007-06-04 03:21) [14]

- Как можно узнать сколько раз процесс подключался к процессору?
- Еще интересует врямя выполнения процесса без пропусков (когда другие процессы выталквают его), т.е. "чистое" время выполнения без простоев, но информация должна сниматься не в конце завершения процесса а периодически с опредленными интервалами. Как првильно  или луше организовать: 1. впотоках  каждого выполняемого дочернего процесса; 2. или циклически в потоке родительского процесса?


> sniknik ©   (04.06.07 02:19) [13]
> > и как же сделать если несколько процессов?


- огромное спасибо, попробую разобраться.



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

Текущий архив: 2007.06.24;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.014 c
2-1179403094
kubatura
2007-05-17 15:58
2007.06.24
игнорирование регистра в запросе


8-1161079322
CyMKuH
2006-10-17 14:02
2007.06.24
Теги


2-1180688001
Fly____
2007-06-01 12:53
2007.06.24
Нет ли у кого функции получения кода цвета из строки?


15-1180025838
Витян
2007-05-24 20:57
2007.06.24
Зачем мне нужна электронная почта??


2-1179891332
Galiaf
2007-05-23 07:35
2007.06.24
Совместимость