Externes Programm getrennt von Hauptprogramm ausführen?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut

Externes Programm getrennt von Hauptprogramm ausführen?

Beitragvon Martin V » 6. Aug 2010, 14:42 Externes Programm getrennt von Hauptprogramm ausführen?

Hallo,

hier
http://www.lazarusforum.de/viewtopic.php?f=10&t=3509
und hier
http://wiki.lazarus.freepascal.org/Executing_External_Programs/de

finden sich Beschreibungen, wie man in einem Lazarus-Programm ein fremdes Programm ausführt und sogar damit kommuniziert. In allen Beispielen ist jedoch gedacht, daß ein z.B. Kommandozeilentool ausgeführt wird und man wieder zum Hauptprogramm zurückkehrt. Während das fremde Programm abgearbeitet wird, ist das Hauptprogramm gelähmt. Man könnte nun einen tThread kreieren und den Aufruf SysUtils.ExecuteProcess (Exename, Parameter) in Thread.Execute plazieren. Aber wenn das Hauptprogramm beendet wird, wird das externe Programm ebenfalls beendet. Wie starte ich nun ein externes Programm (plattformunabhängig) völlig eigenständig, ohne Verbindungen zum Hauptprogramm, so daß das abgetrennte externe Programm weiterläuft, wenn das Hauptprogramm beendet wird?

Martin
Martin V
 
Beiträge: 122
Registriert: 30. Jan 2010, 19:35
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon DiBo33 » 6. Aug 2010, 15:06 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Plattformunabhängig kann ich dir jetzt nicht sagen, unter Linux kannst du das Programm mit nohub starten.

Code: Alles auswählen
nohub programm [parameter]


Edit: unter Win könntest du es mit start versuchen

Code: Alles auswählen
start programm [parameter]
DiBo33
 
Beiträge: 334
Registriert: 11. Okt 2007, 17:01

Beitragvon Teekeks » 6. Aug 2010, 15:28 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Nutze einen TProcess ohne die Option [powaitonexit].
Dann kann man mittels
Code: Alles auswählen
while proces1.Activ do Application.ProcessMessages;

Das Programm im Hintergrund laufen lassen, und man kann dennoch weiter Arbeiten mit dem Programm.
Teekeks
 
Beiträge: 359
Registriert: 27. Mai 2009, 19:54
Wohnort: Cottbus
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2) | 
CPU-Target: x86
Nach oben

Beitragvon Martin V » 6. Aug 2010, 22:51 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Hallo,

ich meinte natürlich wie ich das in Lazarus programmiere, nicht wie ich das in der Kommandozeile bzw. im Terminal mache. (Trotzdem danke)

Ich könnte natürlich per SysUtils.ExecuteProcess ein cmd.exe bzw. ein Terminal starten und daraus das Programm dann abtrennen. Ich glaub aber einfach nicht, daß das so kompliziert sein soll. Ich will auch keine Kommunikation u.a., einfach nur extern starten und tschüss.

Martin
Martin V
 
Beiträge: 122
Registriert: 30. Jan 2010, 19:35
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z) | 
CPU-Target: xxBit
Nach oben

Beitragvon DiBo33 » 6. Aug 2010, 23:27 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Wo ist das Problem bei TProcess.ComandLine nohub oder start einzubauen?

Code: Alles auswählen
procedure run(command: string);
var
  AProcess: TProcess;
  starter: string;
begin
    {$ifdef windows}
    starter :='start ';
    {$else}
    starter := 'nohub ';
    {$endif}
    AProcess := TProcess.Create(nil);
    try
      AProcess.CommandLine := starter + command;
      AProcess.Execute;
    finally
      AProcess.Free;
    end;
end;
DiBo33
 
Beiträge: 334
Registriert: 11. Okt 2007, 17:01

Beitragvon Teekeks » 7. Aug 2010, 01:36 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Und warum nicht mit Lazarus eigenen Mitteln?
Code: Alles auswählen
procedure run(command: string);
var
  AProcess: TProcess;
begin
    AProcess := TProcess.Create(nil);
    AProcess.Options:=AProcess.Options-[poWaitOnExit];
    try
      AProcess.CommandLine := command;
      AProcess.Execute;
      while AProcess.Activ do
         Application.ProcessMessages;
    finally
      AProcess.Free;
    end;
end;
Teekeks
 
Beiträge: 359
Registriert: 27. Mai 2009, 19:54
Wohnort: Cottbus
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2) | 
CPU-Target: x86
Nach oben

Beitragvon DiBo33 » 7. Aug 2010, 01:40 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Und warum nicht mit Lazarus eigenen Mitteln?


Weil in dem Moment wo das Lazarus-Programm beendet wird, auch der Prozess beendet wird und genau das will der TE vermeiden.
DiBo33
 
Beiträge: 334
Registriert: 11. Okt 2007, 17:01

Beitragvon Teekeks » 7. Aug 2010, 01:45 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Ach tatsächlich, jetzt Lese ich es auch. Lesen sollte man können :(
Gut! ich nehme alles zurück und behaupte das Gegenteil! ;)

Gruß Teekeks
Teekeks
 
Beiträge: 359
Registriert: 27. Mai 2009, 19:54
Wohnort: Cottbus
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2) | 
CPU-Target: x86
Nach oben

Beitragvon MacWomble » 23. Sep 2018, 16:30 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Gibt es hierfür denn nun eine Lösung?

Auch ich möchte Programm2 aus Programm1 starten und Programm1 dann beenden, ohne dass auch Programm2 beendet wird.


Unter http://wiki.freepascal.org/Executing_External_Programs wird es so beschrieben, funktioniert aber nicht (Programm2 wird ebenfalls beendet):
Code: Alles auswählen
Run detached program
 
Normally a program started by your application is a child process and is killed, when your application is killed. When you want to run a standalone program that keeps running, you can use the following:
 
var
  Process: TProcess;
  I: Integer;
begin
  Process := TProcess.Create(nil);
  try
    Process.InheritHandles := False;
    Process.Options := [];
    Process.ShowWindow := swoShow;
 
    // Copy default environment variables including DISPLAY variable for GUI application to work
    for I := 1 to GetEnvironmentVariableCount do
      Process.Environment.Add(GetEnvironmentString(I));
 
    Process.Executable := '/usr/bin/gedit'
    Process.Execute;
  finally
    Process.Free;
  end;
end;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 591
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon MacWomble » 24. Sep 2018, 07:05 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Ich habe einen Workaround im Netz gefunden

Code: Alles auswählen
procedure Tfrmupdater.StartDetachedProgram(cmd: string);
var
  sh: TStringList;
  //const fn=Application.Location + PathDelim + 'startdetach';
begin
  sh := TStringList.Create;
  sh.add('nohup ' + cmd + ' >/dev/null 2>&1 &');
  sh.add('disown');
  sh.add('exit');
  sh.SaveToFile(Application.Location + PathDelim + 'startdetach');
  fpSystem('bash < ' + Application.Location + PathDelim + 'startdetach');
  deletefile(Application.Location + PathDelim + 'startdetach');
  sh.Free;
end;     
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 591
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon Timm Thaler » 24. Sep 2018, 13:15 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Der Würgaround bedingt aber, dass nohub installiert ist. Auch nicht so toll.
Timm Thaler
 
Beiträge: 707
Registriert: 20. Mär 2016, 22:14
OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded | 
CPU-Target: Raspberry Pi 3
Nach oben

Beitragvon MacWomble » 24. Sep 2018, 17:52 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Gibt es denn eine andere Lösung?
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 591
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon Socke » 24. Sep 2018, 18:52 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Timm Thaler hat geschrieben:Der Würgaround bedingt aber, dass nohub installiert ist. Auch nicht so toll.

nohup gehört zu POSIX; daher wird es auf jedem gängigen Linux vorhanden sein - es sei denn, deine Anwender stellen sich ihr Linux selbst von Grund auf zusammen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
 
Beiträge: 2546
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon MacWomble » 25. Sep 2018, 10:28 Re: Externes Programm getrennt von Hauptprogramm ausführen?

Socke hat geschrieben:
Timm Thaler hat geschrieben:Der Würgaround bedingt aber, dass nohub installiert ist. Auch nicht so toll.

nohup gehört zu POSIX; daher wird es auf jedem gängigen Linux vorhanden sein - es sei denn, deine Anwender stellen sich ihr Linux selbst von Grund auf zusammen.


Ja, aber ist eben nicht Plattformübergreifend ...
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 591
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

• Themenende •

Zurück zu Freepascal



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste

cron
porpoises-institution
accuracy-worried