AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TConsoleProcess - Konsolen Prozesse einbinden

TConsoleProcess - Konsolen Prozesse einbinden

Ein Thema von LoRd-MuldeR · begonnen am 25. Feb 2006 · letzter Beitrag vom 30. Jun 2008
Antwort Antwort
Benutzerbild von LoRd-MuldeR
LoRd-MuldeR
Registriert seit: 9. Okt 2005
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
Angehängte Dateien
Dateityp: 7z tconsoleprocess.2006-02.25_109.7z (163,8 KB, 110x aufgerufen)
 
Benutzerbild von sundance
sundance

 
Delphi 7 Professional
 
#2
  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
diablist
 
#3
  Alt 30. Jun 2008, 00:36
End how to send key command? please help
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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