Einzelnen Beitrag anzeigen

Benutzerbild von sundance
sundance

Registriert seit: 9. Mai 2006
98 Beiträge
 
Delphi 7 Professional
 
#2

Re: TConsoleProcess - Konsolen Prozesse einbinden

  Alt 21. Aug 2006, 13:55
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-
  Mit Zitat antworten Zitat