TProcess - Output in Laufzeit (live) auslesen ?!

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
sebden206
Beiträge: 1
Registriert: Di 3. Aug 2010, 15:54

TProcess - Output in Laufzeit (live) auslesen ?!

Beitrag von sebden206 »

Hallo,

ich probiere mich seit Tagen daran dieses Problem zu lösen.

Ich habe hier ein Programm womit ich 7zip ansteuere. Der pure Aufruf perTProcess läuft wunderbar. Als Eigenschaften setzte ich poWaitOnExit und poUsePipes.

Nach dem Process1.Execute folgt ein ListBox1.Items.LoadFromStream(Process1.Output).

Auch bis hier ist alles wunderbar, da ich immerhin einen verwertbaren Output bekomme.

Nun möchte ich gern für diese und weitere Anwendungen aber die Ausgabe in der Dosbox in echtzeit abgreifen, was offenbar so nicht möglich ist. Auch wegen dem poWaitOnExit... Das WIKI hilft mir absolut garnicht in diesem Fall. Auch das Beispiel für "Großen Output lesen" bekomme ich auf dieses simple Scenario nicht zugeschnitten.

Gibt es einen gutem Tip hierfür? Oder Ein Gegenstück zu Delphi's - DosCommand welches eine Live-Ausgabe wunderbar beherrscht?

LG :D

Teekeks
Beiträge: 359
Registriert: Mi 27. Mai 2009, 20:54
OS, Lazarus, FPC: OpenSuse11.4 x86 (Lazarus: 0.9.30 FPC 2.4.2)
CPU-Target: x86
Wohnort: Cottbus

Re: TProcess - Output in Laufzeit (live) auslesen ?!

Beitrag von Teekeks »

Hier habe ich mal einen kleinen ausschnitt:

Code: Alles auswählen

const
   READ_BYTES = 2048;
var proc:TProcess;
   n: LongInt;
   str:string;
begin
  proc:=TProcess.Create(nil);
  proc.Options:=proc.Options+[poWaitOnExit];
   Proc.CommandLine :=extractfilepath(paramstr(0))+'tmp.bat';
   Proc.Execute;
   while Proc.Running do
   begin
     // versuche es zu lesen
     n := Proc.Output.Read(str, READ_BYTES);
     if n > 0
     then begin
       Write(str);
     end
     else begin
       // keine Daten, warte 100 ms
       Sleep(100);
     end;
   end;
   // lese den letzten Teil
   repeat
     n := Proc.Output.Read(str, READ_BYTES);
     if n > 0
     then begin
       Write(str);
     end;
   until n <= 0;
  proc.Free;
end;
Das sollte so gehen.

Edit: das ist auch für großen Output.
Edit: ich sehe gerade das da was beim copy und paste verloren gegangen ist...

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TProcess - Output in Laufzeit (live) auslesen ?!

Beitrag von Socke »

So in etwa müsste das aber auch im Wiki drin stehen.
Probleme bekommst du nur damit, dass deine Fenster während der externe Prozess läuft nicht mehr reagieren (können). Daher müsstest du in den Schleifen ein Application.ProcessMessages; einfügen, damit alle Klicks abgearbeitet werden und alles gezeichnet wird. Alternativ könntest du dir TAsyncProcess anschauen, der (soweit ich weiß) Events zum Lesen bereitstellt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten