Чтение StdOut Asynch из консольного приложения переменного тока
У меня есть консоль c приложением. Я выполняю его из C# без вывода сообщений, используя перенаправление стандартного вывода, и делаю это синхронно, что прекрасно работает. Теперь я хочу сделать это в асинхронной манере, которая дает вывод, как в режиме синхронизации. то есть событие OutPutDataRecuted запускается, но только после того, как приложение консоли (exe) завершается. Событие OutputDataRecpected запускается для каждой строки после завершения, а не сразу, как только оно получает строку в выводе.
Код для asynch работает для CMD.exe и т. Д. Итак, я уверен, что его приложение на основе c имеет проблемы с выводом. К вашему сведению: вывод в консоль c осуществляется с использованием printf. Основываясь на моих выводах: я думаю, что консольное приложение не передает вывод / запись в стандартный вывод, пока не завершит свое выполнение. Я пытался установить буфер на ноль или сбрасывать после каждого printf, но ни один не работает.
Какие-нибудь хитрости??
2 ответа
Вы можете отключить буферизацию, используя setvbuf.
Вот быстрый пример, если вы удалите вызов setvbuf
тогда перенаправленный контент записывается только после того, как вы нажмете Enter (в ожидании getchar()). С setvbuf
строка записывается в перенаправленный поток напрямую.
int _tmain(int argc, _TCHAR* argv[])
{
setvbuf(stdout, NULL,_IONBF, 0);
printf("Hello");
getchar();
return 0;
}
Спасибо человек. Это сработало как шарм.
Я использовал 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);
}