Текущий архив: 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