mit meiner Procedure ProcessCmdline (Siehe unten) lese ich den Output diverser Commandline Programme ein.
Das funktioniert schonn einige Zeit wunderbar, auch bei größeren Ausgabedaten im Bereich 200k Byte.
Nun hängt das ganze aber, ohne dass sich sie Größe des Output wesentlich geändert hätte.
Der Prozess mit dem Commandline-Programm beendet siche nie und ProcessCmdline() bekommt keine Daten mehr und wartet in der repeat Schleife natürlich endlos.
Wenn ich den Commandline-Prozess abschieße, hat ProcessCmdline() nur ca. 80 Zeilen des Output gelesen. Insgesamt sollten es aber ca. 1800 Zeilen sein.
Woran kann das liegen, kann das ein Fehler in TProcess sein?
Warum hängt der Commandline Prozess schon bei 80 Zeilen, wenn im anderen Falls problemlos 1800 Zeilen funktionieren?
Kann es von den Ausgabedaten selber abhängen (z. B. Sonderzeichen)?
Wie kann ich das ganze irgendwie debuggen?
Viele Grüße
WS
Code: Alles auswählen
procedure ProcessCmdline(cmdLine:string; strList:TStringList);
const
READ_BYTES = 4096;
var
AProcess : TProcess;
ms : TMemoryStream;
bytesRead : integer;
n : integer;
begin
bytesRead := 0;
ms := TMemoryStream.Create;
ms.SetSize(READ_BYTES);
AProcess := TProcess.Create(nil);
AProcess.Options := AProcess.Options + [poUsePipes];
AProcess.ShowWindow := swoHIDE;
AProcess.CommandLine := cmdLine;
AProcess.Execute;
repeat
if AProcess.Output.NumBytesAvailable > 0 then begin
n := 0;
n := AProcess.Output.Read((ms.Memory+BytesRead)^, READ_BYTES);
if n>0 then begin
inc(BytesRead, n);
ms.SetSize(BytesRead + READ_BYTES);
end;
end;
until not AProcess.Running;
ms.SetSize(BytesRead);
strList.Clear;
strList.LoadFromStream(ms);
AProcess.Free;
end;