![]() |
GetExitCodeProcess richtig verwenden
Ich habe hier mal eine Funktion implementiert, die überprüft, ob ein Prozess beendet wurde:
Delphi-Quellcode:
Funktioniert das so zuverlässig oder hab eich da was übersehen?
function TKillProcess.HasProcessTerminated: Boolean;
var ProcessHandle: Cardinal; ProcessExitCode: DWORD; const PROCESS_QUERY_LIMITED_INFORMATION = $1000; begin Result := False; ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION, False, FProcessID); if ProcessHandle <> 0 then begin if GetExitCodeProcess(ProcessHandle, ProcessExitCode) then begin case ProcessExitCode of STILL_ACTIVE: Result := False; else Result := True; end; end else begin RaiseLastOSError; end; CloseHandle(ProcessHandle); end else begin RaiseLastOSError; end; end; |
AW: GetExitCodeProcess richtig verwenden
Wenn ich den MSDN-Artikel richtig verstanden habe, sollte das so richtig sein. Allerdings könnte man das IMO noch kürzen:
Delphi-Quellcode:
if GetExitCodeProcess(ProcessHandle, ProcessExitCode) then
begin Result := ProcessExitCode <> STILL_ACTIVE; end else begin RaiseLastOSError; end; |
AW: GetExitCodeProcess richtig verwenden
Ich denke mal, daß das CloseHandle eher in einem finally-Block stehen sollte. Ansonsten bleibt die Referenz nämlich im Fehlerfall.
Sonst sehe ich auf Anhieb keine Probleme. Allerdings ist die beste Methode das zu ermitteln was du willst noch immer ![]() |
AW: GetExitCodeProcess richtig verwenden
Ok, danke fürs drübergucken.
|
AW: GetExitCodeProcess richtig verwenden
Nun ja, die Zuverlässigkeit ist nicht 100%ig gegeben. In MSDN steht nämlich auch drin, dass man als Programmierer es möglichst vermeiden sollte, die Konstante STILL_ACTIVE als Exitcode zu setzen. Nimmt man jetzt eine zufällige Verteilung der Exitcodes an, ist das 2^-32*100%.
Ist es nicht sicherer, sich einen Process-Snapshot zu besorgen und mit Hilfe von FirstProcess()/NextProcess() den Prozess zu suchen? Wenn er da nicht dabei ist, lebt er auch nicht mehr. Das sollte reichen, weil die ProcessID nun mal während der gesamten Laufzeit seit dem letzten Neustart einmalig sind. Bernhard |
AW: GetExitCodeProcess richtig verwenden
Oder man benutzt
![]() Sowohl Threads als auch Prozesse werden signalisiert wenn sie beendet wurden. |
AW: GetExitCodeProcess richtig verwenden
Könnte man natürlich auch machen. dann könnte man auch gleichzeitig einbauen mehrere gleichnamige Prozesse zu beenden, wie es schon vorgeschlagen wurde.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz