Чтение StdOut Asynch из консольного приложения c - PullRequest
0 голосов
/ 09 сентября 2010

У меня есть консольное приложение c.Я выполняю его из c # без вывода сообщений, используя перенаправление стандартного вывода, и делаю это синхронно, что прекрасно работает.Теперь я хочу сделать это в асинхронной манере, которая дает вывод как синхронизирующая манера.то есть событие OutPutDataRecoted запускается, но только после того, как приложение консоли (exe) завершается. Событие OutputDataRecpected запускается для каждой строки после завершения, а не сразу, как только он получает строку в выводе.

Код для асинхронности работает дляCMD.exe и т. Д. Итак, я уверен, что его приложение на основе c имеет проблемы в выводе.К вашему сведению: вывод в консоль c осуществляется с использованием printf.Основываясь на моих выводах: я думаю, что консольное приложение не передает вывод / запись в стандартный вывод, пока не завершит свое выполнение.Я пытался установить буфер равным нулю или сбрасывать после каждого printf, но ни один не работает.

Любые хитрости ??

Ответы [ 2 ]

2 голосов
/ 11 сентября 2010

Спасибо, мужик. Это сработало как талисман.

Я использовал setbuf для установки нулевого буфера.

Действительно ценю усилия всех вас, парень,

Для получения информации оДругой парень, это был мой код на C #, который доступен на интернет-форумах и ТАК.

        string command = @"Output.exe"; 
  string arguments = "hellotext"; 

  ProcessStartInfo info = new ProcessStartInfo(command, arguments); 

  // Redirect the standard output of the process.  
  info.RedirectStandardOutput = true; 
  info.RedirectStandardError = true; 

  // Set UseShellExecute to false for redirection 
  info.UseShellExecute = false; 

  Process proc = new Process(); 
  proc.StartInfo = info; 
  proc.EnableRaisingEvents = true; 

  // Set our event handler to asynchronously read the sort output. 
  proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived); 
  proc.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived); 
  proc.Exited += new EventHandler(proc_Exited); 

  proc.Start(); 
  // Start the asynchronous read of the sort output stream. Note this line! 
  proc.BeginOutputReadLine(); 
  proc.BeginErrorReadLine(); 

  proc.WaitForExit(); 

  Console.WriteLine("Exited (Main)"); 

} 

static void proc_Exited(object sender, EventArgs e) 
{ 

  Console.WriteLine("Exited (Event)"); 
} 



static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e) 
{ 
  Console.WriteLine("Error: {0}", e.Data); 
} 



static void proc_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
  Console.WriteLine("Output data: {0}", e.Data); 
} 
1 голос
/ 10 сентября 2010

Вы можете отключить буферизацию, используя setvbuf .

Вот краткий пример: если вы удалите вызов на setvbuf, то перенаправленное содержимое будет записано только после того, как вы нажмете ввод (ожидание на getchar ()). С setvbuf строка записывается в перенаправленный поток напрямую.

int _tmain(int argc, _TCHAR* argv[])
{
  setvbuf(stdout, NULL,_IONBF, 0);
  printf("Hello");
  getchar();
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...