Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Programm starten und auf Programmende warten (https://www.delphipraxis.net/56362-programm-starten-und-auf-programmende-warten.html)

Aike 4. Nov 2005 15:41


Programm starten und auf Programmende warten
 
Hallöchen,

ich habe mal wieder ein Problem ;-)

Ich würde gerne ein Programm starten, z.B. den Taschenrechner von Windows, und dann, wenn der Taschenrechner wieder geschlossen wurde, mit meinem Programm eine ShowMessage() ausgeben. Das Programm wird mit ShellExecute gestartet (ist klar), aber wie bekomme ich heraus, ob das Programm noch aktiv ist. Mit der Window-Caption kann man leider nicht arbeiten, weil man das in meinem Programm nicht hardcoden kann/darf.

Für Links im Forum hier bin ich auch dankbar, aber ich hab keinen Ansatz dafür, was ich machen kann oder womit ich arbeiten könnte. Von dieser Thenmatik verstehe ich noch recht wenig :-/

Danke wie immer für eure Hilfe :-)


Liebe Grüße
Aike

ichbins 4. Nov 2005 15:47

Re: Programm starten und auf Programmende warten
 
shellexecuteandwait

[edit]
shellexecuteandwait hab ich mal gelesen, das gibt es bei mir nicht. Fürs erste kannst du mal das machen:
Delphi-Quellcode:
shellexecute(form1.Handle,'open',pansichar('calc.exe'),nil,nil,0);
[/edit]

himitsu 4. Nov 2005 15:51

Re: Programm starten und auf Programmende warten
 
Oder mal nach Hier im Forum suchenShellExecute CreateProcess suchen ^^

z.B. Hilfe: ShellExecute und warten

ichbins 4. Nov 2005 15:52

Re: Programm starten und auf Programmende warten
 
hier hab ich auch was gefunden:
Shellexecuteandwait

ichbins 4. Nov 2005 16:03

Re: Programm starten und auf Programmende warten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier eine Unit von Olli:

cruso 4. Nov 2005 16:16

Re: Programm starten und auf Programmende warten
 
Hi!

Schau mal in der Suche nach! Ich kann mich erinnern, dass es vor kurzem (vor ein, zwei Tagen) schon mal so was ähnliches gefragt worden ist (Hier war es das gleiche nur mit notepad.exe)!

Aike 4. Nov 2005 16:33

Re: Programm starten und auf Programmende warten
 
Das Problem an der ShellApiEx ist, dass mein Programm so lange "in der Luft hängt", bis das Programm beendet wurde. Wenn man also ein anderes Fenster über das meinige zieht, dann verschwinden alle Elemente aus der Listbox (wie bei einem hängengebliebenen Programm). Das finde ich aber ... uncool ;p

[edit]Das war übringes auch das Problem in dem anderen Thread, den du erwähnt hast. Leider gab es da keine Lösung für das Problem.[/edit]

himitsu 4. Nov 2005 16:51

Re: Programm starten und auf Programmende warten
 
Das it ja geade der Sinn dieser Codes, daß die Befehler auf das Beenden des aufgerufenen Programms warten ^^

Du kannst aber den Programmaufruf in einen Anderen Thread auslagern, somit kann der Hauptthread unbehelligt weiterarbeiten.

Notfalls machst du dir auch einfach 'ne Schleife in den Hauptthread, welche solange wartet, bis der Thread (mit dem Programmaufruf fertig ist).
Und in diese Schleife dann ein Application.ProgressMessages und ein Sleep(100), oder sowas in der Art.

ichbins 4. Nov 2005 17:05

Re: Programm starten und auf Programmende warten
 
Hinters
Delphi-Quellcode:
application.processmessages
am besten immer ein
Delphi-Quellcode:
if application.terminated then exit;
Damit der User das Programm auch beenden kann, während es in der Schleife wartet.

Aike 4. Nov 2005 17:27

Re: Programm starten und auf Programmende warten
 
Zitat:

Zitat von himitsu
Du kannst aber den Programmaufruf in einen Anderen Thread auslagern, somit kann der Hauptthread unbehelligt weiterarbeiten.

Bewirkt das nicht, dass genau der Sinn des Wartens umgangen wird?


Zitat:

Zitat von himitsu
Notfalls machst du dir auch einfach 'ne Schleife in den Hauptthread, welche solange wartet, bis der Thread (mit dem Programmaufruf fertig ist).
Und in diese Schleife dann ein Application.ProgressMessages und ein Sleep(100), oder sowas in der Art.

Da wüsste ich nicht, wie das gehen sollte, bin aber offen für sowas. Einen Thread zu erstellen ist für mich zwar nicht einfach, aber das würde ich in erin oder zwei Stunden auch hinbekommen ;-) Von ProcessMessages habe ich aber gar keine Ahnung.

himitsu 4. Nov 2005 20:07

Re: Programm starten und auf Programmende warten
 
Zitat:

Zitat von Aike
Bewirkt das nicht, dass genau der Sinn des Wartens umgangen wird?

Im Grunde genommen JA :roll:
Aber du kannst dann ja durch die Schleige im Hauptthread dennoch warten ;)

Zitat:

Zitat von Aike
Da wüsste ich nicht, wie das gehen sollte, bin aber offen für sowas. Einen Thread zu erstellen ist für mich zwar nicht einfach, aber das würde ich in erin oder zwei Stunden auch hinbekommen ;-) Von ProcessMessages habe ich aber gar keine Ahnung.

so als kleines Beispiel:
Delphi-Quellcode:
ThreadStartenUndDateiÜbergeben...
// prüfen ob Thread noch Läuft
While isThreadNochAktiv
  // prüfen of der Benutzter einen Abbruch wünscht
  and not Application.Terminated do Begin
  // Botschaftswarteschlange abarbeiten
  Application.ProcessMessages;
  // kleine Pause ... für die CPU-Auslastung
  Sleep(100);
End;

Aike 5. Nov 2005 10:07

Re: Programm starten und auf Programmende warten
 
Gut, ich hab mir jetzt also einen Thread dazu erstellt, in dem die Programme gestartet werden können. Hier die neuen Probleme ;-)

- Im Thread kann ich mit ShellExecuteAndWait() keine übergebene Datei (vom Typ string) aufrufen, da ShellExecuteAndWait() eine Var vom Typ PWideChar verlangt. Eine Typenumwandlung mit PWideChar() bringt nichts.
- Mit Sleep() hängt mein Programm genauso wie bei ShellExecuteAndWait() :-/
- Mir fällt keine Lösung ein, wie ich überprüfen könnte, dass der Thread noch existiert, wenn ShellExecuteAndWait() nicht geht. Ansonsten könnte man sowas machen ...
Delphi-Quellcode:
//Thread
ThreadGestartet:=True;
ShellExecuteAndWait();
ThreadGestartet:=False;

//Hauptprogramm
Thread.Create()
//Irgendwie warten (while-Schleife?)
if not uThread.ThreadGestartet then
  MachWeiterMitDemLustigenProgramm;

Aike 14. Nov 2005 13:56

Re: Programm starten und auf Programmende warten
 
Ich kenne mich nicht besonders aus mit Threads, aber was ich mir grade gedacht hab, war, dass man den Thread doch irgendwie releasen oder terminieren muss, wenn man ihn beenden will. Kann man auf diese Art vielleicht rausfinden, ob der Thread noch am laufen ist? Nein? Aaaaah! Hilfe ;-)

Ianisp 15. Nov 2005 13:52

Re: Programm starten und auf Programmende warten
 
Hi Aike,

Probiere mal das:

Delphi-Quellcode:
procedure TMainForm.runProcess(ExeName, Parameter: String; wait: boolean);
var SUInfo: TStartupInfo;
    ProcInfo: TProcessInformation;
    bool:boolean;
begin
   FillChar(SUInfo, SizeOf(SUInfo), #0);
   with SUInfo do begin
     cb := SizeOf(SUInfo);
     dwFlags := STARTF_USESHOWWINDOW;
   end;
   bool := CreateProcess(NIL, PChar(EXEName+' '+Parameter), NIL, NIL, FALSE,
                           CREATE_NEW_CONSOLE or
                           NORMAL_PRIORITY_CLASS, NIL,
                           PChar(ApplicationDir),
                           SUInfo, ProcInfo);
   if (bool)and(wait) then
     while WaitForSingleObject(ProcInfo.hProcess, 100 {INFINITE})=WAIT_TIMEOUT do begin
        //refresh;
        Application.ProcessMessages;
        if Application.Terminated then
           Break;
     end;
end;


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