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;