ich glaube, ich habe ein Bug in TProcess entdeckt. Wenn man die selbe Instanz von TProcess zur Ausführung mehrerer Programme nacheinander nutzt und dabei die Konsolenausgabe aus der Pipe mitschneidet, gibt es Probleme. Habe folgendes Testprogramm geschrieben:
Code: Alles auswählen
program tprocesstest;
uses process, classes, sysUtils;
var
br : longint;
buf : Array [0..1023] of char;
proc : TProcess;
nExec : integer;
nSave : integer;
str : TStringList;
begin
if (paramStr(1) = 'recursive') then begin
WriteLn('Nachricht 1');
sleep(10);
WriteLn('Nachricht 2');
end else begin
nExec := 0;
nSave := 0;
proc := TProcess.create(nil);
repeat begin
if (nExec = 3273) then begin
WriteLn('critical'); // you can debug from here
end;
proc.Executable := paramStr(0);
proc.Parameters.add('recursive');
proc.Options := [poUsePipes, poNoConsole];
proc.ShowWindow := swoNone;
proc.Execute;
repeat begin
br := proc.Output.Read({%H-}buf[0], Length(buf));
end until (br = 0);
nExec += 1;
WriteLn('Exec '+inttostr(nExec));
if (nExec >= nSave + 100) then begin // don't save too often as this may hurt the drive...
nSave := nExec;
str := TStringList.create;
str.Add(inttostr(nSave));
try
str.saveToFile(ExtractFilePath(paramStr(0))+'nSaved.txt');
except
end;
str.destroy;
end;
end until false; // run til infinity
proc.destroy;
end;
end.
Ob es sich dabei um das gleiche Bug handelt, kann ich jetzt noch nicht sagen. Ich wollte das erstmal selber weiter untersuchen, kann den Code von TProcess.execute aber nicht debuggen. Habe schon das gesamte Programm und auch die IDE mit Debug-Symbolen re-kompiliert, aber in TProcess fehlen diese scheinbar weiterhin. Wie bekomme ich Lazarus dazu, auch diese Komponente mit Debug-Symbolen neu zu übersetzen?