![]() |
Prüfen ob ein Prozess (noch) existiert
Hi,
ich möchte bei mir etwas umstellen und daher prüfen ob ein Prozess, der aktuell wie folgt gestartet wird,...:
Delphi-Quellcode:
...noch läuft.
CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), 0, nil, PWideChar(ws), CREATE_DEFAULT_ERROR_MODE, nil, PWideChar(param), @si, @pif) then
sleep(500); if PIf.dwProcessId > 0 then begin AppPID := PIf.dwProcessId; CloseHandle(PIf.hProcess); CloseHandle(PIf.hThread); end; Ich habe Beispiele gefunden, die auf die *.exe abzielen, ich würde aber lieber auf die PID schauen, da eindeutig. Kann mir da jemand einen Schubser geben? Ich glaube ich sehe den Wald wieder vor lauten Bäumen nicht. |
AW: Prüfen ob ein Prozess (noch) existiert
Sowas in der Art?
Delphi-Quellcode:
uses
TlHelp32; function FindProcessByPid(const Pid : Cardinal) : Boolean; var hProc, hSnapshot: THandle; Pe32: TProcessEntry32; begin Result := false; hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); Pe32.dwSize := SizeOf(TProcessEntry32); if Process32First(hSnapshot, Pe32) then begin repeat if pe32.th32ProcessID = Pid then begin Result := True; break; end; until not Process32Next(hSnapshot, Pe32); end; CloseHandle(hSnapshot); end; |
AW: Prüfen ob ein Prozess (noch) existiert
Sieht vielversprechend aus, schaue ich mir an. Danke schon mal.
Lazarus kennt TlHelp32 nicht, evtl. auch weil ich Lazarus 64bit nutze. Gibts dafür eine Alternative? ich denke das sollte jwatlhelp32 sein. Teste ich mal. |
AW: Prüfen ob ein Prozess (noch) existiert
Wie sehen denn die Routinen aus, die ein Programm über den Namen suchen?
![]() Da wird u. a. 'ne Unit jwaTlHelp32 genutzt. Aber alle Beispile dort enthalten irgendwo die ProcessID, so dass man die Routinen entsprechend Deinen Wünschen anpassen können dürfte. |
AW: Prüfen ob ein Prozess (noch) existiert
Zitat:
Man kann auch mit Lazaruscompilaten die Prozesse einlesen. Siehe meine Programme unter ![]() |
AW: Prüfen ob ein Prozess (noch) existiert
Wozu suchen?
Es existiert bereits ein Handle, direkt zu dem Prozess. jedenfalls bis dahin, wo es geschlossen wird. (CloseHandle) Wie überall zu finden, kann man also auch direkt warten, mit einem WaitForSingleObject/WaitForMultipleObjects vor dem CloseHandle. ![]() ![]() uvvvm. Schließen muß man es aber garnicht (sofort), also statt der ID hebt man sich das Handle auf. Und so lange kann man mit WaitForSingleObject/WaitForMultipleObjects warten (mit einem ganz kurzen Timeout kann man es auch nutzen, um zu gucken ob es noch läuft) oder mit GetExitCodeProcess prüfen ob es schon beendet wurde (wenn nicht, dann liefert das ja ein False). Am Ende natürlich nicht vergessen zu das Handle freizugeben. |
AW: Prüfen ob ein Prozess (noch) existiert
Danke für die Tipps.
Ggf. bin ich mal wieder zu verbohrt in meiner Denkweise^^ Es geht nur darum ein gestartetes Programm zu überwachen und Aktionen auszuführen wenn es beendet wurde. Aber das überwachende Programm soll natürlich in der Zeit weiter bedienbar sein. Daher wollte ich das per Timer + Prüfen ob PID noch existiert im Hintergrund machen. Ich dachte über die PID wäre das am einfachsten (evtl. weil ich das von AutoIt mittlerweile so gewöhnt bin (ProcessExists($PID)). Aber wenns mit dem Handle einfacher ist, muss ich mir das nochmal durch den Kopf gehen lassen. Den Timer würde ich später schauen durch ggf. etwas schöneres zu ersetzen, da ich mit Tasks bisher noch nichts gemacht habe. |
AW: Prüfen ob ein Prozess (noch) existiert
Wie gesagt, einfach das Handle merken und nicht sofort nach dem CreateProcess freigeben.
Mit diesem Handle kann man dann jederzeit direkt prüfen, ohne unnötig umständlich zu suchen, ob der Prozess noch arbeitet.
Delphi-Quellcode:
anstatt
MerkenZumPrüfenMitGetExitCodeProcess := PIf.hProcess;
Delphi-Quellcode:
(Letzeres dann machen, wenn man ganz fertig mit Prüfen ist)
CloseHandle(PIf.hProcess);
PS: Falls pif vorher nicht mit 0 initialisiert wurde, dann ist [DELPHI]if PIf.dwProcessId > 0 then[DELPHI] falsch, denn Zitat:
Delphi-Quellcode:
Das Sleep sollte auch unnötig sein. (die Daten in diesem Record werden sich in der Zwischenzeit garantiert nicht ändern)
Result := CreateProcessWithLogonW(PWideChar(User), nil, PWideChar(PW), 0, nil, PWideChar(ws), CREATE_DEFAULT_ERROR_MODE, nil, PWideChar(param), @si, @pif);
if Result <> 0 then |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 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 by Thomas Breitkreuz