2012-06-14 71 views
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"); 
} 
+1

您是否让C++程序运行足够长的时间来使'stdout'的内部缓冲区填满并刷新?我不知道Windows的缺省缓冲区大小是什么;它可能是4k左右。如果对这个问题的回答是“不”或“是吧?”,请尽量缩短睡眠时间并延长信息,运行程序至少几秒钟,然后观察C#程序是否突然看到一吨一次输出全部。 –

+0

您确定关于process.StartInfo.RedirectStandardOutput = false;? –

+0

如果是这样,那么你的问题是写入'stdout'得到缓冲;你应该能够使它行缓冲(即实际上每个换行都写出输出),但我不认为Microsoft C运行时支持它;但你可以通过调用'setvbuf'来缓冲它:http://msdn.microsoft.com/en-us/library/86cebhfs.aspx或者你可以写入'stderr'而不是'stdout'; 'stderr'没有缓冲。 –

回答

0

谢谢你们所有的投入!

我想我会改变我的所有printf为std :: cout和std :: endl为我的C++控制台程序。

相关问题