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'没有缓冲。 –