2
這是我單擊C#GUI程序中的按鈕時調用的方法。它啓動了一個非常簡單的C++控制檯程序,它無所不能,只是在永無止境的循環中每秒打印一行。將printf C++控制檯輸出重定向到C#
private static Process process;
private void LaunchCommandLineApp()
{
process = new Process();
process.StartInfo.FileName = "SimpleTest.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.EnableRaisingEvents = true;
process.StartInfo.CreateNoWindow = false;
process.OutputDataReceived += process_OutputDataReceived;
process.Start();
process.BeginOutputReadLine();
}
這是處理接收到的任何輸出數據的方法:
private void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
Console.WriteLine(e.Data.ToString());
}
我沒有看到在我的C#調試輸出的任何輸出... 但是,如果我改變的printf到std :: cout,它會顯示重定向的消息。
我在想如果有什麼方法可以用printf顯示這些語句?
FYI:我的C++代碼[EDITED工作版本]:
#include <stdio.h>
#include <Windows.h>
#include <iostream>
int main()
{
int i = 0;
for(;;)
{
Sleep(1000);
i++;
// this version of printf with fflush will work
printf("The current value of i is %d\n", i);
fflush(stdout);
// this version of cout will also work
//std::cout << "the current value of i is " << i << std::endl;
}
printf("Program exit\n");
}
您是否讓C++程序運行足夠長的時間來使'stdout'的內部緩衝區填滿並刷新?我不知道Windows的缺省緩衝區大小是什麼;它可能是4k左右。如果對這個問題的回答是「不」或「是吧?」,請儘量縮短睡眠時間並延長信息,運行程序至少幾秒鐘,然後觀察C#程序是否突然看到一噸一次輸出全部。 –
您確定關於process.StartInfo.RedirectStandardOutput = false;? –
如果是這樣,那麼你的問題是寫入'stdout'得到緩衝;你應該能夠使它行緩衝(即實際上每個換行都寫出輸出),但我不認爲Microsoft C運行時支持它;但你可以通過調用'setvbuf'來緩衝它:http://msdn.microsoft.com/en-us/library/86cebhfs.aspx或者你可以寫入'stderr'而不是'stdout'; 'stderr'沒有緩衝。 –