gpt4 book ai didi

c# - 读取其他进程控制台输出

转载 作者:太空狗 更新时间:2023-10-29 21:36:23 24 4
gpt4 key购买 nike

当控制台输出以“waves”形式返回时,我遇到了问题。例如控制台每秒输出一些东西,例如事件每分钟触发 60 次(所有事件同时发生)。

我的代码:

Process Proc = new Process();
Proc.StartInfo.FileName = SSMS.BinaryDir + "HldsUpdateTool.exe";
Proc.StartInfo.Arguments = "-command update -game tf -dir " + SSMS.RootDir + Key;
Proc.StartInfo.UseShellExecute = false;
Proc.StartInfo.RedirectStandardOutput = true;
Proc.StartInfo.RedirectStandardError = true;

Proc.EnableRaisingEvents = true;
Proc.StartInfo.CreateNoWindow = false;

Proc.ErrorDataReceived += new DataReceivedEventHandler(Proc_ErrorDataReceived);
Proc.OutputDataReceived += new DataReceivedEventHandler(Proc_OutputDataReceived);
Proc.Exited += new EventHandler(Proc_Exited);

Proc.Start();
Proc.BeginErrorReadLine();
Proc.BeginOutputReadLine();

我可能怀疑更新工具有问题。其他带有控制台输出的程序工作正常。

在事件被触发的时间线中:(=什么都没发生;|事件被触发)

Should be: ==|==|==|==|==|==|==  
Is: ========|||||||=========||||||=====

最佳答案

您正在看到程序正在使用的标准输出输出缓冲区的效果。这是 C 运行时库的标准功能,当它检测到它正在写入管道而不是控制台时,将启用缓冲。而不是在程序中的每个 printf() 语句之后自动刷新。缓冲区通常约为 2 KB。并且只有在装满时才会被冲走。这大大提高了效率,每次刷新都会增加很多开销。当输出写入文件或设备时,在正常重定向场景中很重要。

你可以看到这是怎么回事,你看到的团 block 是那个缓冲区的内容。对此没有简单的解决方法,程序中需要进行手术以禁用缓冲区或在重要的地方刷新缓冲区。这总是责任停止的地方,如果你能改变程序,你就不会这样做。您可以通过缓冲从 OutputDataReceived 获得的内容来滴灌您的控制台,但这也许有点愚蠢。

当程序发送输出的速度快于您处理它的速度时,您将看不到这种效果。这很常见。它有效地受到限制,在等待输出缓冲区清空并快速填充它时阻塞。

对此还有一个解释,OutputReceived 的触发速率还取决于您运行的线程池线程数。如果大于cpu核数,调用OutputReceived的tp线程可能会延迟0.5秒的倍数。但是,您会在重定向的所有程序上看到结 block 。

关于c# - 读取其他进程控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5362121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com