Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   TConsoleProcess - Konsolen Prozesse einbinden (https://www.delphipraxis.net/63967-tconsoleprocess-konsolen-prozesse-einbinden.html)

LoRd-MuldeR 25. Feb 2006 13:20


TConsoleProcess - Konsolen Prozesse einbinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi

Ich hatte bisher immer JvCreateProcess verwendet, um Konsolen-Prozesse in meine Delphi-Programme zu integrieren. Irgendwann war ich es aber leid, dass JvCreateProcess den Text-Output der Konsole nur völlig unzuverlässig weiterleitet. Manchmal fehlten einfach Zeilen oder die Zeilen waren schlicht unvollständig. Das ganze war absolut unberechenbar und es war keine Regelmäßigkeit zu erkennen. Für mich war es aber von größter Wichtigkeit, den Konsolen-Output korrekt zu parsen. Deshalb habe ich nun versucht das ganze selbst zu lösen und mir eine eigene Klasse gebastelt, um Konsolen-Prozesse einzubinden. Das ganze ist möglichst allgemeint gefasst und funktioniert soweit zuverlässig. Aber vllt hat der ein oder andere trotzdem noch ein paar Anregungen...

Im Anhang der Code (Delphi 7) plus ein kleines Demo-Programm :-D

sundance 21. Aug 2006 13:55

Re: TConsoleProcess - Konsolen Prozesse einbinden
 
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-

diablist 30. Jun 2008 00:36

Re: TConsoleProcess - Konsolen Prozesse einbinden
 
End how to send key command? please help


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz