Einzelnen Beitrag anzeigen

Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Output von gepipter Konsole kann nicht ausgelesen werden

  Alt 25. Sep 2012, 10:35
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.
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS

Geändert von alleinherrscher (25. Sep 2012 um 14:56 Uhr)
  Mit Zitat antworten Zitat