2016-03-29 4 views
1

Я выполняю exe-файл, который содержит некоторый c-код из моей winform C#, но я получаю полный вывод кода c только после полного выполнения exe. Я хочу, чтобы exe передавал свой вывод на мою winform синхронно (строка за строкой в ​​реальном времени).Синхронное чтение stdout процесса

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

Что значит 'некоторый c-код'? Никакой текст не записывается на вывод, если только он не выполнил * процесс *. Вы должны проверить код 'background.exe'. И убедитесь, что 'background.exe' на самом деле является скомпилированным двоичным исполняемым файлом, а не только C-файлом с другим расширением –

+0

Вы проверили этот [вопрос] (http://stackoverflow.com/questions/285760/how- to-spawn-a-process-and-capture-its-stdout-in-net) и этот [вопрос] (http://stackoverflow.com/questions/18588659/redirect-process-output-c-sharp)? –

+0

Проверял все примеры кода, и они считывали вывод только после завершения процесса. –

ответ

0

Попробуйте, который свободно адаптировано из this example:

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); 
    } 

Обратите внимание, что обработчик события, который принимает выходной сигнал от пульта выполняется команда в другом потоке, так что вы должны убедиться, что все вы используете для отображения вывода в вашей форме, происходит в потоке пользовательского интерфейса.

Смежные вопросы