![]() |
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 |
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:
d.h. die Bedingung "StillRunning = false" wird nicht erreicht.
procedure TForm1.btStartClick(Sender: TObject);
begin ConsoleProcess.Priority := ppNormal; ConsoleProcess.Start(edCmdline.Text); repeat Application.ProcessMessages until (ConsoleProcess.StillRunning = false); ConsoleReadEvent('Process finished...'); end; Wenn man sich das Ganze genauer ansieht, liegt es scheinbar irgendwo innerhalb von DoProcessExit():
Delphi-Quellcode:
... 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.
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; 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- |
Re: TConsoleProcess - Konsolen Prozesse einbinden
End how to send key command? please help
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz