【发布时间】:2017-06-08 10:55:46
【问题描述】:
我需要从 C# 应用程序控制用 C++ 编写的控制台应用程序。
C# 应用程序无法从 C++ 应用程序的输出中读取任何内容。使用函数process.StandardOutput.ReadLine() 时应用程序冻结。我尝试仅使用 printf("Test sample\r\n") 和 Console.WriteLine("Test sample") 在 C#、C++ 中创建简单的控制台应用程序。示例 C# 应用程序运行良好,但 C++ 不行。所以我不知道我在哪里犯了错误。可能 C++ 应用程序写错了行尾,但我不知道如何解决。
用 C# 编写的主应用程序代码示例,用于控制用 C++ 或 C# 编写的另一个应用程序。
process= new Process()
{
StartInfo = new ProcessStartInfo(@"testApp")
{
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = false,
WindowStyle = ProcessWindowStyle.Hidden
}
};
process.Start();
inputWriter = process.StandardInput;
string text =process.StandardOutput.ReadLine();//C++ app freezes here
还有两个测试应用
在 C++ 中
int main(){
while (true) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
printf("Test send data\r\n");
}
return 0;}
在 C# 中
static void Main(string[] args)
{
while (true)
{
Thread.Sleep(500);
Console.WriteLine("Test send data");
}
}
【问题讨论】:
-
只是为了测试一下,如果你在 C++ 程序中写了一个像普通的
"\n"这样的换行符呢?没有回车(应该由底层库代码自动添加)? -
我试过了,还是一样的问题。
-
您的 C++ 应用程序会在其输出被重定向时自动将 stdout 置于缓冲模式。在填满或关闭标准输出之前,该缓冲区不会被刷新,并且其内容对您的 C# 应用程序可用。当你睡那么多,至少一两分钟时,这将需要相当长的时间。使用 fflush() 或 std::flush。
-
@HansPassant 感谢您的帮助。效果很好! :)