AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetExitCodeProcess richtig verwenden

Ein Thema von Luckie · begonnen am 21. Nov 2010 · letzter Beitrag vom 21. Nov 2010
Antwort Antwort
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

GetExitCodeProcess richtig verwenden

  Alt 21. Nov 2010, 16:47
Ich habe hier mal eine Funktion implementiert, die überprüft, ob ein Prozess beendet wurde:
Delphi-Quellcode:
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;
Funktioniert das so zuverlässig oder hab eich da was übersehen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.622 Beiträge
 
Delphi 12 Athens
 
#2

AW: GetExitCodeProcess richtig verwenden

  Alt 21. Nov 2010, 17:02
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#3

AW: GetExitCodeProcess richtig verwenden

  Alt 21. Nov 2010, 17:02
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 MSDN-Library durchsuchenWaitForSingleObject.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: GetExitCodeProcess richtig verwenden

  Alt 21. Nov 2010, 17:06
Ok, danke fürs drübergucken.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#5

AW: GetExitCodeProcess richtig verwenden

  Alt 21. Nov 2010, 17:08
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
Bernhard
Iliacos intra muros peccatur et extra!
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#6

AW: GetExitCodeProcess richtig verwenden

  Alt 21. Nov 2010, 17:11
Oder man benutzt MSDN-Library durchsuchenWaitForSingleObject wie es von Alters her üblich ist

Sowohl Threads als auch Prozesse werden signalisiert wenn sie beendet wurden.
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: GetExitCodeProcess richtig verwenden

  Alt 21. Nov 2010, 17:12
Könnte man natürlich auch machen. dann könnte man auch gleichzeitig einbauen mehrere gleichnamige Prozesse zu beenden, wie es schon vorgeschlagen wurde.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz