[gelöst] TProcess und OnTerminate Event ?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

[gelöst] TProcess und OnTerminate Event ?

Beitrag von DonMigos »

Hallo,
gibt es bei TProcess etwas ähnliches wie das OnTerminate Event bei TThreads ?
Also eine Möglichkeit auf die Beendigung eines Prozesses zu reagieren, der ja an das Betriebssystem zum abarbeiten übergeben wird.
ExitStatus und Running von TProcess helfen mir da nicht weiter, weil ich die ja abfragen müsste, ich hätte aber gerne eine direkte Aktion durch das beenden. (Eine Möglichkeit eine Prozedur durch das beenden aufzurufen).
http://lazarus-ccr.sourceforge.net/docs ... ocess.html

Mfg
Zuletzt geändert von DonMigos am Fr 17. Mai 2013, 10:18, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10899
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess und OnTerminate Event ?

Beitrag von theo »

Mit TProcess.WaitOnExit kannst du darauf warten. Kann man auch in einem Extra-Thread ausführen, dann geht OnTerminate.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: TProcess und OnTerminate Event ?

Beitrag von DonMigos »

Danke für die schnelle Antwort !
TProcess.WaitOnExit verhindert aber das ich mehrere Prozesse gleichzeitig starte. Für jeden Prozess wiederum ein Thread zu starten würde ich nicht so gern machen. Das hatte ich vergessen zu sagen, ich will mehrere Prozesse starten und deren Anzahl begrenzen.
Die Aktion am Ende des Prozesses soll diesen (beendeten Prozess) aus einer Liste löschen und dafür einen wartenden (nicht ausgeführten) starten.

Benutzeravatar
theo
Beiträge: 10899
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess und OnTerminate Event ?

Beitrag von theo »

Wieso nicht mit Threads? Wenn die Anzahl Prozesse begrenzt ist, ist das wahrscheinlich das einfachste.
Running willst du nicht abfragen, Threads willst du auch nicht. Da kann ich nicht mehr helfen.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: TProcess und OnTerminate Event ?

Beitrag von DonMigos »

Ja mit Threads wirds wahrscheinlich am einfachsten sein. Aber da TProcess ja ähnlich aufgebaut ist wie TThreads dachte ich es gäbe da eine Möglichkeit.
Könnte man sich eventuell mit TProcess.Handle ein eigenes OnTerminate Event basteln ?
Running und ExitStatus bringen mir ja nur was wenn ich die mit einem Timer abfrage, was aber Performance kostet.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TProcess und OnTerminate Event ?

Beitrag von mse »


mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: TProcess und OnTerminate Event ?

Beitrag von mschnell »

mse hat geschrieben:tmseprocess hat onprocfinished.
http://gitorious.org/mseide-msegui/msei ... rocess.pas
Im Gegensatz zur Implementierung einer Eventqueue ist es ja vermutlich möglich, den kompletten mse-Code für TPropcess ion einem Lazarus-Projekt zu verwenden :?.

-Michael

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: TProcess und OnTerminate Event ?

Beitrag von mse »

mschnell hat geschrieben: Im Gegensatz zur Implementierung einer Eventqueue ist es ja vermutlich möglich, den kompletten mse-Code für TPropcess ion einem Lazarus-Projekt zu verwenden :?.
Vermutlich ja.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: TProcess und OnTerminate Event ?

Beitrag von DonMigos »

Danke für den Tipp. Ich werde mich mal damit auseinandersetzen.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: TProcess und OnTerminate Event ?

Beitrag von DonMigos »

Für die mseprocess.pas braucht man ja noch hundert weitere pas und inc Dateien, das ist mir dann doch zu viel Aufwand.

Aber was ist denn damit ?
http://lazarus-ccr.sourceforge.net/docs ... ocess.html
Hier gibt es ein OnTerminate Event.

Benutzeravatar
theo
Beiträge: 10899
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess und OnTerminate Event ?

Beitrag von theo »

DonMigos hat geschrieben: Aber was ist denn damit ?
Geht wahrscheinlich. Hatte ich vergessen, das gehört zur LCL.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: TProcess und OnTerminate Event ?

Beitrag von DonMigos »

Hmm keine Reaktion, hier mal ein Beispiel:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, AsyncProcess, process;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
   procedure Term(Sender: TObject);  //Aktion am Ende eines AProcess
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Term(Sender: TObject);  //Aktion am Ende eines AProcess
begin
  ShowMessage('Ende');
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  AProcess: TAsyncProcess;
begin
  AProcess := TAsyncProcess.Create(nil);
  try
     AProcess.Executable := 'calc.exe';
    //AProcess.Options := AProcess.Options + [poNoConsole];
    AProcess.OnTerminate:= @term;
    AProcess.Execute;
  finally
      AProcess.Free;
  end;
end;
end. 

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: TProcess und OnTerminate Event ?

Beitrag von DonMigos »

Ah so nee ist ja klar, dass das so nicht geht. Nach Free ist ja nichts mehr da was einen Aufruf startet....

So gehts aber:

Code: Alles auswählen

procedure TForm1.Term(Sender: TObject);  //Aktion am Ende eines AProcess
begin
  ShowMessage('Ende');
end;
 
var
   AProcess: TAsyncProcess;    
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  AProcess := TAsyncProcess.Create(nil);
   AProcess.Executable := 'calc.exe';
   AProcess.OnTerminate:= @term;
   AProcess.Execute;
end;
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
 AProcess.Free;
end;   
Wobei hier dann ein Try except sicher noch sinnvoll wäre...

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: TProcess und OnTerminate Event ?

Beitrag von m.fuchs »

Statt dem .Free beim FormClose würde ich das Aufräumen lieber so machen:

Code: Alles auswählen

procedure TForm1.Term(Sender: TObject);  //Aktion am Ende eines AProcess
begin
  ShowMessage('Ende');
  FreeAndNil(Sender);
end;
Dann ist der Speicher früher frei und du musst auch die Referenz nicht mit speichern.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: TProcess und OnTerminate Event ?

Beitrag von DonMigos »

Danke für den Tipp werde ich so übernehemen. Das kommt wahrscheinlich dem FreeOnTerminate bei Threads gleich.
Ich hatte es auch schon mit AProcess.Free; in der Term Procdure versucht, aber so ist es allgemeiner und besser.

Antworten