Externes Programm starten (gelöst)

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Oli
Beiträge: 11
Registriert: Di 27. Sep 2022, 13:35

Externes Programm starten (gelöst)

Beitrag von Oli »

Ich möchte ein externes Programm starten, aber nicht warten, bis es beendet wurde.

Wenn ich WaitOnExit verwende, wird das externe Programm gestartet und mein Programm wartet solange, bis das externe Programm beendet wird. Das funktioniert.

Nun versuche ich das externe Programm zu starten (es soll nicht automatisch beendet werden, wie in meinem nachstehenden Beispiel), ohne dass mein Programm wartet. Ich habe den Verdacht, dass das mit TProcess nicht geht, oder?

Code: Alles auswählen

program project1;

uses
  sysutils,
  process;

var
  RunProgram: TProcess;

begin
  RunProgram := TProcess.Create(nil);
  RunProgram.Executable:=SetDirSeparators('/usr/bin/geany');
  RunProgram.Parameters.Add('/home/oli/tmp.txt');
  RunProgram.Execute;
  Sleep(3000); // nur damit man sieht, dass das Programm gestartet wird.
  RunProgram.Free;
  writeln('weiter gehts'); // das externe Programm wurde beendet. Es soll aber weiter bestehen bleiben.
end.
Zuletzt geändert von Oli am Fr 30. Jun 2023, 18:43, insgesamt 1-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1639
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Externes Programm starten

Beitrag von fliegermichl »

Am einfachsten die unit lclintf einbinden und den namen des externen Programmes an opendocument übergeben.

Oli
Beiträge: 11
Registriert: Di 27. Sep 2022, 13:35

Re: Externes Programm starten

Beitrag von Oli »

Danke für den Tipp. Ich möchte jedoch nicht ein Dokument mit dem Standardprogramm öffnen, sondern gezielt ein bestimmtes Programm starten (mit oder auch ohne Datei). Geht das?

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Externes Programm starten

Beitrag von shokwave »

Probier mal dein Beispielprogramm, vom ersten Beitrag, von der Kommandozeile und nicht aus der IDE zu starten. Bei mir hat das, auf einem Ubuntu, geklappt.
Unter Windows funktioniertes auch aus der IDE.
mfg Ingo

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 359
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Externes Programm starten

Beitrag von Jorg3000 »

Hi!
In der Hilfe zu TProcess.Destroy steht ...
If a process was started and is still executed, it is not stopped, but the standard input/output/stderr streams are no longer available, because they have been destroyed.
https://www.freepascal.org/docs-html/fc ... stroy.html

D.h. das ausgeführte Programm wird durch dein RunProgram.Free nicht beendet (hätte mich auch gewundert), sondern lediglich die Ausgabe auf die Konsole endet.
Grüße, Jörg

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 580
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 3.9 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Externes Programm starten

Beitrag von Niesi »

Oli hat geschrieben: Fr 30. Jun 2023, 12:42 Ich möchte ein externes Programm starten, aber nicht warten, bis es beendet wurde.

Wenn ich WaitOnExit verwende, wird das externe Programm gestartet und mein Programm wartet solange, bis das externe Programm beendet wird. Das funktioniert.

Nun versuche ich das externe Programm zu starten (es soll nicht automatisch beendet werden, wie in meinem nachstehenden Beispiel), ohne dass mein Programm wartet. Ich habe den Verdacht, dass das mit TProcess nicht geht, oder?

Code: Alles auswählen

program project1;

uses
  sysutils,
  process;

var
  RunProgram: TProcess;

begin
  RunProgram := TProcess.Create(nil);
  RunProgram.Executable:=SetDirSeparators('/usr/bin/geany');
  RunProgram.Parameters.Add('/home/oli/tmp.txt');
  RunProgram.Execute;
  Sleep(3000); // nur damit man sieht, dass das Programm gestartet wird.
  RunProgram.Free;
  writeln('weiter gehts'); // das externe Programm wurde beendet. Es soll aber weiter bestehen bleiben.
end.

Ich bin nicht sicher und kann es gerade nicht ausprobieren, aber lass mal das RunProgram.Free weg ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Oli
Beiträge: 11
Registriert: Di 27. Sep 2022, 13:35

Re: Externes Programm starten

Beitrag von Oli »

Vielen Dank für eure Lösungsvorschläge. Die Antwort von shokwave war goldrichtig. Wenn ich das Programm unter Linux aus der Konsole starte (und nicht aus der IDE) bleibt das externe Programm bestehen und wird nicht automatisch geschlossen. Somit liegt es an der IDE und nicht an meinem Programm.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6762
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Externes Programm starten (gelöst)

Beitrag von af0815 »

In der IDE wird ein Programm unter dem Debugger gestartet und nach dem Beenden durch diesen aufgeräumt. Das ist ist der Unterschied, den es zu beachten gibt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten