Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Schleife in Delphi (https://www.delphipraxis.net/204991-schleife-delphi.html)

lukdelphias 21. Jul 2020 09:08

Schleife in Delphi
 
Hallo liebes Forum für mein Projekt brauche ich eine Schleife welche überprüft ob ein Prozess aktiv ist. Sobald der Prozess inaktiv ist soll das Programm eine ANDERE exe ausführen.
Ein Funktion für die Prozessüberwachung habe ich schon.
Alleridngs habe ich keine Idee für die Schleife. Im Moment fällt mir nur eine Endlosschelife ein, damit hängt sich aber das Programm logischerweise auf und öffnet die exe tausende male

Hier mein Ansatz:
Delphi-Quellcode:
while True do
      if processExists('box.exe') then ShowMessage('AKTIV')
      else ShellExecute(0,'open', PChar('U:\Programme\box\delete.exe'), nil, nil, SW_HIDE);
Wie würde ihr das machen sodass die Prozesse nur solange gescannt werden bis ein Prozess beendet wurde?

Grüße

Dalai 21. Jul 2020 09:14

AW: Schleife in Delphi
 
Wie wär's mit
Delphi-Quellcode:
while processExists('box.exe') do begin
    Sleep(500);
end;
ShellExecute(0,'open', PChar('U:\Programme\box\delete.exe'), nil, nil, SW_HIDE);
Geht natürlich auch mit fußgesteuerter Schleife, also z.B.
Delphi-Quellcode:
repeat [...] until NOT processExists(...)
.

Ich vermute aber, dass du das im Hintergrund machen willst. Dafür würde sich vielleicht ein Timer anbieten.

Grüße
Dalai

lukdelphias 21. Jul 2020 09:22

AW: Schleife in Delphi
 
Perfekt deine erste Lösung hat mir gereicht. Nur dein sleep hab ich durch ein Delay getauscht. Für delay hab ich eine eigene Unit gemacht. Damit macht das Programm zwar eine 'Pause' allerdings läuft es im Hintergrund.
Vielen Dank für die Hilfe.

Grüße

Hobbycoder 21. Jul 2020 10:28

AW: Schleife in Delphi
 
Wenn du deine "box.exe" selbst startest, könntest du auch mit WaitForSingleObject arbeiten

Delphi-Quellcode:
function RunProcess(FileName: string; ShowCmd: DWORD; wait: Boolean; ProcID: PDWORD): Longword;
var
   StartupInfo: TStartupInfo;
   ProcessInfo: TProcessInformation;
begin
   FillChar(StartupInfo, SizeOf(StartupInfo), #0);
   StartupInfo.cb := SizeOf(StartupInfo);
   StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
   StartupInfo.wShowWindow := ShowCmd;
   if not CreateProcess(nil,
     @Filename[1],
     nil,
     nil,
     False,
     CREATE_NEW_CONSOLE or
     NORMAL_PRIORITY_CLASS,
     nil,
     nil,
     StartupInfo,
     ProcessInfo)
     then
       Result := WAIT_FAILED
   else
   begin
     if wait = FALSE then
     begin
       if ProcID <> nil then ProcID^ := ProcessInfo.dwProcessId;
       exit;
     end;
     WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
     GetExitCodeProcess(ProcessInfo.hProcess, Result);
   end;
   if ProcessInfo.hProcess <> 0 then
     CloseHandle(ProcessInfo.hProcess);
   if ProcessInfo.hThread <> 0 then
     CloseHandle(ProcessInfo.hThread);
end;

lukdelphias 21. Jul 2020 10:43

AW: Schleife in Delphi
 
Danke für den Tipp,
alleridngs starte ich die exe nicht selbst. Das läuft über einen automatisierten Vorgang und dieser startet die exe alle 30 Minuten.

Gruß

sakura 21. Jul 2020 12:27

AW: Schleife in Delphi
 
Zitat:

Zitat von lukdelphias (Beitrag 1469977)
alleridngs starte ich die exe nicht selbst. Das läuft über einen automatisierten Vorgang und dieser startet die exe alle 30 Minuten.

Du könntest Dir aber die Prozess-ID suchen und dann mit WaitForSingleObject arbeiten. Das wäre dann der korrekte - also "offizielle" - Weg. ;-)

Hier im Forum suchenProzess ID suchen

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:15 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