2016-03-29 3 views
1

Ich führe eine EXE-Datei, die einige c-Code von meinem C# winform enthält, aber ich bekomme die vollständige Ausgabe des c-Code erst nach der vollständigen Ausführung von exe. Ich möchte, dass die Exe ihre Ausgabe synchron an meine Winform weiterleitet (Zeile für Zeile in Echtzeit).Synchronous lesen stdout eines Prozesses

var proc = new Process 
     { 
      StartInfo = new ProcessStartInfo 
      { 
       FileName = "background.exe", 
       Arguments = command, 
       UseShellExecute = false, 
       RedirectStandardOutput = true, 
       CreateNoWindow = true 
      } 
     }; 


     proc.Start(); 
     while (!proc.StandardOutput.EndOfStream) 
     { 
      ConsoleWindow.AppendText(proc.StandardOutput.ReadLine()); 
      ConsoleWindow.AppendText(Environment.NewLine); 

     } 
+0

Was meinst du mit "irgendeinem c-Code"? Kein Text wird zur Ausgabe geschrieben, es sei denn, der ausführende Prozess * setzt ihn dort hin. Sie sollten den Code 'background.exe' überprüfen. Und stellen Sie sicher, dass 'background.exe' eigentlich eine kompilierte binäre ausführbare Datei ist und nicht nur eine C-Datei mit einer anderen Erweiterung. –

+0

Haben Sie diese [Frage] überprüft (http://stackoverflow.com/questions/285760/how- to-spawn-a-process-und-capture-its-stdout-in-net) und diese [Frage] (http://stackoverflow.com/questions/18588659/redirect-process-output-c-sharp)? –

+0

Überprüft alle Codebeispiele und sie lesen die Ausgabe erst nach Abschluss des Prozesses. –

Antwort

0

das Versuchen, die lose von this example angepasst:

private void button1_Click(object sender, EventArgs e) 
    { 
     var consoleProcess = new Process 
     { 
      StartInfo = 
      { 
       FileName = 
        @"background.exe", 
       UseShellExecute = false, 
       RedirectStandardOutput = true 
      } 
     }; 

     consoleProcess.OutputDataReceived += ConsoleOutputHandler; 
     consoleProcess.StartInfo.RedirectStandardInput = true; 
     consoleProcess.Start(); 
     consoleProcess.BeginOutputReadLine(); 
    } 

    private void ConsoleOutputHandler(object sendingProcess, 
     DataReceivedEventArgs outLine) 
    { 
     // This is the method in your form that's 
     // going to display the line of output from the console. 
     WriteToOutput(outLine.Data); 
    } 

Beachten Sie, dass der Event-Handler, der die Ausgabe von der Konsole empfängt auf einem anderen Thread ausgeführt wird, so dass Sie sicherstellen, dass müssen was auch immer Sie verwenden, um die Ausgabe in Ihrem Formular anzuzeigen, tritt auf dem UI-Thread auf.