TProcess starten und danach Anwendung beenden, beendet auch Tprocess :(

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

TProcess starten und danach Anwendung beenden, beendet auch Tprocess :(

Beitrag von corpsman »

Servus zusammen,

ich hab ne kleine App gebaut die mittels TProcess das Programm "meld" (ist ein Linux tool zum vergleichen von Dateien) startet und sich dann eigentlich beenden soll, dazu habe ich folgenden Code geschrieben:

Code: Alles auswählen

Procedure TForm1.AddFilePath(Value: String);
Var
  P: TProcessUTF8;
Begin
      p := TProcessUTF8.Create(Nil);
      Try
        p.Executable := 'meld';
        p.Parameters.Add('Datei1.txt');
        p.Parameters.Add('Datei2.txt');
        p.Options := [];
        p.Execute;
      Finally
        p.free;
      End;
      sleep(5000);
      close;
    End
    Else Begin
      // Nichts die Datei ist die selbe die wir schon gewählt haben ..
    End;
  End;
End;    
meld geht auch auf und zeigt mir beide Dateien an, wenn die 5s des Sleep aber vorbei sind, wird mein Programm und auch meld einfach beendet, dabei will ich eigentlich dass nur mein Programm zu geht und meld offen bleibt. Weis jemand was ich falsch mache ?

Mittels poWaitonExit zu warten geht nicht, da mein Program via Uniqueinstance nur eine instanz zuläst und ich ggf mehrfach meld über mein Program aufrufen will...
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TProcess starten und danach Anwendung beenden, beendet auch Tprocess :(

Beitrag von corpsman »

hier steht in section Run detached program, dass man das flag

Code: Alles auswählen

Process.InheritHandles := False;
setzen soll, aber das geht auch nicht :/
--
Just try it

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1629
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: TProcess starten und danach Anwendung beenden, beendet auch Tprocess :(

Beitrag von corpsman »

Ah, habs raus gefunden, das hängt daran, dass ich das ganze via Debugger gemacht habe.
Startet man mein Program ohne debugger, dann verhällt sich alles wie man es erwarten würde ..
--
Just try it

Warf
Beiträge: 2141
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: TProcess starten und danach Anwendung beenden, beendet auch Tprocess :(

Beitrag von Warf »

Das Problem ist das unter Linux dein jeder Kindesprozess standardmäßig die Konsole des Aufrufenden Prozesses erbt. Wenn du dann die Konsole schließt, bekommt alle child Prozesse ein HUP Signal und werden beendet (alternativ Versuchen sie was auf STDOut zu schreiben und läuft in einen error und crasht dann).

Wenn du das Programm im debugger öffnest erzeugt Lazarus eine neue Konsole für den debugging Prozess, sobald der debugger beendet wird wird die Konsole geschlossen, deshalb beobachtest su das Verhalten.
Wenn du die Anwendung aus deinem Desktop öffnest hat die Anwendung kein Terminal und daher wird auch nix vererbt.
Wenn du deine Anwendung aus einer Konsole startest, dann erben die Kindsprozesse die selbe Konsole, und wenn du die dann beendest bekommen alle Prozesse die daraus entstanden sind ihr HUP

Antworten