2012-06-14 106 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++控制檯程序。

相關問題