Einzelnen Beitrag anzeigen

Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Kommandozeilenprogramm ausführen und Ausgabe umleiten

  Alt 22. Jun 2010, 22:21
Das ist dann aber doof wenn der Zwischenpuffer voll läuft. dann wartet das ausgeführte Programm darauf das dieser geleert wird, und das ausführende Programm wartet darauf das sich das Programm beendet, damit der Puffen geleert werden kann.
Ergo: Endloßschleife.

Besser ist das hier:
Delphi-Quellcode:
   
const
   READ_BYTES = 2048;

var proc:TProcess;
   S2: TStringList;
   M: TMemoryStream;
   n: LongInt;
   BytesRead: LongInt;
begin
   M := TMemoryStream.Create;
   BytesRead := 0;
   proc:=TProcess.create;
   proc.Options:=[poUsePipes];
   Proc.CommandLine :='WasAuchImmer.echse';
   Proc.Execute;
   while Proc.Running do
   begin
     // stellt sicher daß wir Platz haben
     M.SetSize(BytesRead + READ_BYTES);

     // versuche es zu lesen
     n := Proc.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
     if n > 0
     then begin
       Inc(BytesRead, n);
     end
     else begin
       // keine Daten, warte 100 ms
       Sleep(100);
     end;
   end;
   // lese den letzten Teil
   repeat
     // stellt sicher daß wir Platz haben
     M.SetSize(BytesRead + READ_BYTES);
     // versuche es zu lesen
     n := Proc.Output.Read((M.Memory + BytesRead)^, READ_BYTES);
     if n > 0
     then begin
       Inc(BytesRead, n);
     end;
   until n <= 0;
   M.SetSize(BytesRead);

   S2 := TStringList.Create;
   S2.LoadFromStream(M);
//mache was mit dem Output...
   S2.Free;
   M.Free;
   proc.free;
end;
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat