Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi JvCreateProcess: Ausgabe von Konsolenanwendung abfragen (https://www.delphipraxis.net/132903-jvcreateprocess-ausgabe-von-konsolenanwendung-abfragen.html)

Passi077 21. Apr 2009 22:07


JvCreateProcess: Ausgabe von Konsolenanwendung abfragen
 
Hi,

ich hab mir das Beispiel zu JvCreateProcess der JEDI Library angeschaut. Ich möchte damit ein C Konsolenprogramm steuern, und die Ausgaben auswerten.

Delphi-Quellcode:
procedure TForm1.StartCommandProcessor;
begin
  { Retrieve the command processor name }
  if not JclSysInfo.GetEnvironmentVar('COMSPEC', CommandLine) or (Length(CommandLine) = 0) then
    { Paranoid }
    CommandLine := 'COMMAND.EXE';

  JvCreateProcess1.CommandLine := CommandLine;
  { Redirect console output, we'll receive the output via the OnRead event }
  JvCreateProcess1.ConsoleOptions := JvCreateProcess1.ConsoleOptions + [coRedirect];
  { Hide the console window }
  JvCreateProcess1.StartupInfo.ShowWindow := swHide;
  JvCreateProcess1.StartupInfo.DefaultWindowState := False;
  { And start the console }

  JvCreateProcess1.Run;

end;

procedure TForm1.JvCreateProcess1Read(Sender: TObject; const S: String;
  const StartsOnNewLine: Boolean);
begin
  memo1.Lines.Add(s);
end;
Starte ich nun über den JvProcess eine C-Konsolenanwendung, so funktioniert das leider nicht komplett. Die C-Anwendung sieht ganz einfach aus:

Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int i=0;
  printf("testausgabe\n");
  scanf("%d", i);
  print("Zeichen eingelesen");
  return 0;
}
Leider wird mein Memo mit den Ausgaben erst befüllt, sobald die C-Anwendung beendet ist (es kommen dann alle Ausgaben auf einmal).

Woran liegt das, und wie ändere ich das so das jede Ausgabe der Konsolenanwendung sofort sichtbar ist?
Dabei ist es egal, ob ich das C-Programm oder das Delphi Programm anpassen muss.. ist beides ok ;)

Danke + Grüße
Pascal

DevilsCamp 22. Apr 2009 09:31

Re: JvCreateProcess: Ausgabe von Konsolenanwendung abfragen
 
Ich kenne mich mit JvCreateProcess jetzt nicht besonders aus. Aber bei Lazarus z.B. besteht auch das Problem.

Die Komponente dürfte das Event wohl erst abfeuern, wenn ein interner Buffer voll ist. Wenn der nun bei z.B. 4KiB ist, aber nur 200 Bytes an Ausgabe existieren (jetzt mal übertrieben in einem Zeitraum von 5 Minuten), so wird das Event erst abgefeuert, wenn das externe Programm beendet wird.

Möglicherweise kannst du diesen Buffer auf 1 Byte runterschrauben, in einem Thread (z.B.) die Ausgabe mitlesen und dann bei jedem Zeilenumbruch eine eigene Methode aufrufen lassen.

Vielleicht existiert auch ein Event bei der Komponente, das die Ausgabe selber schon nach jedem Zeilenumbruch bekannt gibt.

Passi077 22. Apr 2009 17:20

Re: JvCreateProcess: Ausgabe von Konsolenanwendung abfragen
 
Hi,

vielen Dank für Deinen Hinweis, Du hast vollkommen Recht: das liegt an einem internen Buffer.
Habs gerade ausprobiert. Ab 4097 Byte Ausgabe kommt diese auch in meinem Delphi Programm an.

Leider hab ich keine Option für die JEDI Komponente gefunden, die es mir ermöglichen würde den Buffer zu verringern/auszuschalten.
Gibt es andere Möglichkeiten für mein Vorhaben? Muss nicht zwingend über die JEDI Komponente passieren, hatte mir nur erhofft das es damit schnell geht.

Viele Grüße
Pascal

DevilsCamp 22. Apr 2009 19:00

Re: JvCreateProcess: Ausgabe von Konsolenanwendung abfragen
 
Dir wird wohl nichts anderes übrig bleiben, als das ganze selber zu implementieren.
Vielleicht hilft dir DAS hier weiter.

Passi077 23. Apr 2009 22:14

Re: JvCreateProcess: Ausgabe von Konsolenanwendung abfragen
 
Ok, Danke für die Hilfe.

Habs jetzt aber einfach so gemacht, dass ich vom C Programm aus WM_COPYDATA Messages an's Delphi Programm sende.
Die Ausgabe auszulesen hab ich nach ein paar Versuchen nicht hinbekommen, und für meine Zwecke reicht das mit den Messages vollkommen aus :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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