habe ein kleines Problem mit TProcess und der Übergabe von Steuerkommandos an ein Konsolenprogramm.
Worum geht es .
Ich benutze für meine Aerodynamikprogramme öfter mal das Konsolen-Programm XFOIL.
Hiermit kann man die Aerodynamischen Eigenschaften von Flugzeugprofilen berechnen.
Normal wird XFoil gestartet und man steuert es per Handeingaben.
Für eine Automatik per Script habe ich bis dato eine Batch-Datei und ein Sript-Textdatei verwendet.
Beispiel: Start.bat
Code: Alles auswählen
xfoil.exe < script.txt
echo XFoil ist fertig mit rechnen!! > fertig.txt
In der Datei Script.txt stehen dann die Kommandos , die das XFoil steuern .
Und am Ende fällt hinten eine Text-Tabelle mit den Berechneten Werten raus .
Das funktioniert eigentlich Problemlos , es sei denn , das XFoil gerät in ein Koma , hängt sich also weg .
Das passiert nicht sehr oft , aber ab und an doch mal und dann hat man ein Zombie am laufen , unschön.
Die Batch kann man nun auch schön per TProcess starten , funzt tadellos, es sei den XFoil stürtz ab , dann kommt man zwar an den Process heran (das Batchprogramm) aber nicht an die XFoil.exe selber , da das ja ein Prozess ist , den das Batch erzeugt hat .
Code: Alles auswählen
// Start per Batch , alte Vorgehensweise
procedure TForm1.Button1Click(Sender: TObject);
begin
p:=tprocess.Create(nil);
P.Options := [poWaitOnExit];
p.Executable:=pfad+'\start.bat';
p.Execute;
freeandnil(p);
end;
Nun dachte ich mir , benutze doch einfach TProcess direct mit der XFoil.exe.
Also zunächst mal die reine XFoil.exe im Process aufgerufen.
Code: Alles auswählen
// Start der reinen XFoil.exe ohne Übergaben
procedure TForm1.Button2Click(Sender: TObject);
begin
p:=tprocess.Create(nil);
P.Options := [poWaitOnExit];
p.Executable:=pfad+'\xfoil.exe';
p.Execute;
freeandnil(p);
end;
------------
Diese Procedure dann erweitert mit der Möglichkeit , Textkommados zu übergeben.
Code: Alles auswählen
// Versuch mit Kommando-Übergabe
procedure TForm1.Button3Click(Sender: TObject);
var s:string;
begin
p:=tprocess.Create(nil);
P.Options := [poUsePipes];
p.Executable:=pfad+'\xfoil.exe';
p.Execute;
// Ab hier sollen dann die Kommandos (siehe Script.txt) gesendet werden
s:='load NACA4415.DAT';
p.Input.Write(s,length(s));
sleep(2000);
freeandnil(p);
end;
Aber nun startet das XFoil nicht mehr .
Klammere ich die Zeile
Code: Alles auswählen
P.Options := [poUsePipes];
aus , wird XFoil zwar ausgeführt , dafür ballert es dann in der Zeile
Code: Alles auswählen
p.Input.Write(s,length(s));
Hat irgend jemand eine Idee , wie man das zum Laufen bekommen kann ?
Der komplette Code im Anhang.
Gruß
Frank