[gelöst] TProcess und OnTerminate Event ?
-
- 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 ?
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
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.
Re: TProcess und OnTerminate Event ?
Mit TProcess.WaitOnExit kannst du darauf warten. Kann man auch in einem Extra-Thread ausführen, dann geht OnTerminate.
-
- 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 ?
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.
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.
Re: TProcess und OnTerminate Event ?
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.
Running willst du nicht abfragen, Threads willst du auch nicht. Da kann ich nicht mehr helfen.
-
- 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 ?
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.
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.
-
- 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 ?
tmseprocess hat onprocfinished.
http://gitorious.org/mseide-msegui/msei ... rocess.pas
http://gitorious.org/mseide-msegui/msei ... rocess.pas
-
- 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 ?
Im Gegensatz zur Implementierung einer Eventqueue ist es ja vermutlich möglich, den kompletten mse-Code für TPropcess ion einem Lazarus-Projekt zu verwendenmse hat geschrieben:tmseprocess hat onprocfinished.
http://gitorious.org/mseide-msegui/msei ... rocess.pas

-Michael
-
- 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 ?
Vermutlich ja.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.
-
- 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 ?
Danke für den Tipp. Ich werde mich mal damit auseinandersetzen.
-
- 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 ?
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.
Aber was ist denn damit ?
http://lazarus-ccr.sourceforge.net/docs ... ocess.html
Hier gibt es ein OnTerminate Event.
Re: TProcess und OnTerminate Event ?
Geht wahrscheinlich. Hatte ich vergessen, das gehört zur LCL.DonMigos hat geschrieben: Aber was ist denn damit ?
-
- 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 ?
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.
-
- 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 ?
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:
Wobei hier dann ein Try except sicher noch sinnvoll wäre...
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;
- 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 ?
Statt dem .Free beim FormClose würde ich das Aufräumen lieber so machen:
Dann ist der Speicher früher frei und du musst auch die Referenz nicht mit speichern.
Code: Alles auswählen
procedure TForm1.Term(Sender: TObject); //Aktion am Ende eines AProcess
begin
ShowMessage('Ende');
FreeAndNil(Sender);
end;
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
-
- 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 ?
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.
Ich hatte es auch schon mit AProcess.Free; in der Term Procdure versucht, aber so ist es allgemeiner und besser.