2010-09-09 4 views
0

У меня есть консольное приложение c. Я выполняю его из C# без использования режима перенаправления стандартного вывода и выполняю его синхронно, что отлично работает. Теперь я хочу сделать это в асинхронной манере, которая дает результат как синхронизированный способ. i.e Исключенное событие OutPutDataRecieved, но только после завершения консольного приложения (exe). Событие OutputDataRecieved запускается для каждой строки после завершения, а не мгновенно, как только оно получает строку на выходе.Чтение StdOut Asynch из приложения c-консоли

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

Любые трюки ??

+0

Уход за публикацией соответствующего бита вашего кода на C#? –

+0

У вас есть источник для приложений 'C' и C#? Возможно, это поможет, если вы продемонстрируете соответствующие детали. – pmg

+0

Когда вы говорите, что вы задали буфер нулевым, используете ли вы функцию setvbuf? –

ответ

1

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

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

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    setvbuf(stdout, NULL,_IONBF, 0); 
    printf("Hello"); 
    getchar(); 
    return 0; 
} 
2

Thanks man.That работал как шарм.

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

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

Информация о других парнях, это был мой код 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); 
} 
+0

@ user445066, я рад, что помог. –

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