![]() |
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:
Starte ich nun über den JvProcess eine C-Konsolenanwendung, so funktioniert das leider nicht komplett. Die C-Anwendung sieht ganz einfach aus:
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;
Code:
Leider wird mein Memo mit den Ausgaben erst befüllt, sobald die C-Anwendung beendet ist (es kommen dann alle Ausgaben auf einmal).
#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; } 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 |
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. |
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 |
Re: JvCreateProcess: Ausgabe von Konsolenanwendung abfragen
Dir wird wohl nichts anderes übrig bleiben, als das ganze selber zu implementieren.
Vielleicht hilft dir ![]() |
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 15:35 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