Hallo LoRd-MuldeR,
ich habe deine TConsoleProcess-Klasse in einem meiner Projekte getestet und dabei festgestellt, daß bei manchen externen Prozessen (ich hab's mit lame.exe getestet) das Ende desselben nicht erreicht wird:
Delphi-Quellcode:
procedure TForm1.btStartClick(Sender: TObject);
begin
ConsoleProcess.Priority := ppNormal;
ConsoleProcess.Start(edCmdline.Text);
repeat
Application.ProcessMessages
until (ConsoleProcess.StillRunning = false);
ConsoleReadEvent('Process finished...');
end;
d.h. die Bedingung "StillRunning = false" wird nicht erreicht.
Wenn man sich das Ganze genauer ansieht, liegt es scheinbar irgendwo innerhalb von DoProcessExit():
Delphi-Quellcode:
procedure TConsoleProcess.DoProcessExit(ExitCode: DWORD);
begin
if Assigned(ReadThread) then begin
ReadThread.Terminate;
ReadThread.WaitFor;
ReadThread.Free;
end;
Running := False;
ClientProcess := 0;
CloseHandle(ReadPipe);
ReadPipe := 0;
CloseHandle(WritePipe);
WritePipe := 0;
if Assigned(OnProcessExit) then OnProcessExit(ExitCode);
end;
... aus "ReadThread.WaitFor" gibt es dann kein Zurück mehr. Seltsamerweise passiert das aber nicht bei jedem Aufruf von lame.exe; ich konnte noch nicht feststellen, unter welchen Umständen man es erzwingen kann, um den Fehler zu reproduzieren.
Hat sonst jemand ähnliche Erfahrungen gemacht oder gibt's vielleicht schon Abhilfe?
(ich bin immer noch auf der Suche nach einer zuverlässigen Consolenkomponenten, die Ein- und Ausgaben umleiten kann und die bei Bedarf terminiert werden kann...)
-sundance-