Wenn ich die Ausgabe in eine Datei Pipe, ist diese zunächst (wenn die Rechnung läuft) leer. Am Ende der Rechnung muss das Programm mit ENTER beendet werden, was natürlich nicht geht, wenn ich das Programm in eine Datei pipe. Also habe ich CTRL+C gedrückt. Danach beinhaltet die Textdatei den gesamten Output des Programms.
Es handelt sich um ein Simulatiosprogramm für Tunnelspektroskopie auf Halbleitern:
http://www.andrew.cmu.edu/user/feens...ip_v6/UniInt3/
Wenn ich das Fortran richtig verstehe, ist es der Standardoutput:
Code:
WRITE(6,*) ' '
WRITE(16,*) ' '
WRITE(6,*) '
RAD, SLOPE, ANGLE =',
RAD,SLOPE,THETA
WRITE(16,*) '
RAD, SLOPE, ANGLE =',
RAD,SLOPE,THETA
//edit: Okay, Write(6,*) ist der Standard Output in Fortran!
//edit2: Ich habe mal bei Sirius Quelltext folgenden Code gedebugged:
Delphi-Quellcode:
try
repeat //main program loop
//thread is waiting to one of
WaitHandles[1]:=ReadPipeThread.Event.Handle; //new output from childprocess
WaitHandles[2]:=FInputLines.Event.Handle; //user has new line (TDosCommand.Sendline) to deliver
WaitHandles[3]:=FProcessInformation.hProcess; //Process-Ending (child)
WaitHandles[4]:=FTerminateEvent.Handle; //Termination of this thread (from mainthread)
WaitHandles[5]:=FTimer.Event.Handle; //timer elapsed (each second)
t:=WaitforMultipleObjects(length(WaitHandles),
@WaitHandles,
false,
infinite);
outputdebugstring(pchar(inttostr(t)));
case t of
Wait_Object_0 +2 : begin //Process terminated
GetExitCodeProcess(FProcessInformation.hProcess, FExitCode);
end;
Wait_Object_0+1: begin // InputEvent
if ((FInputLines.Count > 0) and not (Terminated)) then
DoSendLine(inputwrite,last,LineBeginned);
if FInputLines.Count>0 then
FInputlines.Event.SetEvent;
end;
Wait_Object_0 +0: begin //ReadEvent
while ReadPipeThread.ReadString.length>0 do
DoReadLine(ReadPipeThread.ReadString,str,last,lineBeginned);
end;
end;
until Terminated or ((FExitCode <> STILL_ACTIVE) //process terminated (normally)
or ((FMaxTimeAfterBeginning < FTimer.SinceBeginning)
and (FMaxTimeAfterBeginning > 0)) //or time out
or ((FMaxTimeAfterLastOutput < FTimer.SinceLastOutput)
and (FMaxTimeAfterLastOutput > 0))); //or time out
if (FExitCode <> Still_Active) then
begin
DoEndStatus(esProcess);
FCanTerminate:=false;
end
else
begin
FCanTerminate:=true;
if Terminated then
DoEndStatus(esStop)
else
DoEndstatus(esTime);
DoTerminateProcess; //stop Process
end;
if (Last <> '') then begin // If not empty flush last output
DoLinesAdd(Last);
if assigned(FOutputLines) then
begin
FSyncStr:=Last;
if LineBeginned then
synchronize(DoSyncOutPutLastLine)
else
synchronize(DoSyncOutPutAdd);
end;
DoNewLine(Last, otEntireLine);
end;
finally
ReadPipeThread.Terminate;
ReadPipeThread.WaitFor;
ReadPipeThread.Free;
if FCanTerminate then
Waitforsingleobject(FProcessInformation.hProcess,1000);
GetExitCodeProcess(FProcessInformation.hProcess,FExitCode);
end;
Das
Handle des Prozesses schickt offenbar kein Signal. Jedenfalls erhalte ich bis zum Ende der Rechnung immer nur t=4 , also das Signal des Timers. Aber wenn ich das Fortran Programm manuell ausführe sehe ich doch den STDOUT in einer Konsole?!?!? merkwürdig.