2010-09-09 54 views
0

我有一個基於控制檯的c應用程序。 我正在執行它從c#靜靜地使用重定向標準輸出,並同步做到這一點,工作正常。 現在我想以異步的方式進行輸出,如同步方式。 即 OutPutDataRecieved事件被激發,但僅在控制檯應用程序(exe)完成後纔會觸發。每條線完成後會觸發每個線路的輸出數據已恢復事件,而不會立即在輸出中獲得一條線路。從c控制檯應用程序讀取StdOut Asynch

asynch的代碼適用於CMD.exe等,所以,我相信它的基於c的應用程序有輸出問題。 僅供參考:c控制檯中的輸出使用printf完成。 根據我的發現: 我認爲c控制檯應用程序在輸出/寫入到標準輸出之前不會完成其執行。 我試過在每個printf後設置緩衝區爲空或刷新,但沒有任何作用。

任何招數?

+0

小心張貼您的C#代碼的相關位? – 2010-09-09 19:41:31

+0

你有'C'和C#應用程序的源代碼嗎?如果你展示了相關的部分,它可能會有所幫助。 – pmg 2010-09-09 19:41:42

+0

當你說你將緩衝區設置爲null時,你使用的是setvbuf函數嗎? – 2010-09-09 19:45:41

回答

1

您可以使用setvbuf禁用緩衝。

下面是一個快速示例,如果您刪除對setvbuf的調用,那麼只有在您按下enter鍵(等待getchar())後纔會寫入重定向內容。通過setvbuf,字符串直接寫入重定向流。

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

感謝man.That工作就像一個魅力。

我正在使用setbuf設置緩衝區爲空。

真的很感謝所有你guyz的努力。

其他guyz的信息,這是我的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,我很高興幫助。 – 2010-09-11 19:39:51