gpt4 book ai didi

c# - 解析更新单个控制台行的进程的输出

转载 作者:太空狗 更新时间:2023-10-30 00:08:30 24 4
gpt4 key购买 nike

问候 stackoverflow 成员,

在 WPF 前端的 BackgroundWorker 中,我运行 sox System.Diagnostics.Process 中的(开源控制台声音处理工具)。以同样的方式,我使用其他几个命令行工具并解析它们的输出以在我的前端填充进度条。

这适用于其他工具但不适用于 Sox,因为它不是为每个进度步骤发送新行,而是仅使用回车符 (\r) 而不使用换行符 (\n) 来更新控制台上的一行.我在 process.StandardError 上尝试了异步和同步读取。

使用异步 process.ErrorDataReceived += (sender, args) => FadeAudioOutputHandler(clip, args); 结合 process.BeginErrorReadLine(); 不会产生任何单独的状态更新,因为出于某种原因回车不会触发 ReadLine,即使 MSDN docs建议它应该。当过程完成时,输出会以一个 block 的形式吐出。

然后我尝试了以下代码,通过对流进行字符读取来实现同步字符:

char[] c;
var line = new StringBuilder();
while (process.StandardError.Peek() > -1)
{
c = new char[1];
process.StandardError.Read(c, 0, c.Length);
if (c[0] == '\r')
{
var percentage = 0;
var regex = new Regex(@"%\s([^\s]+)");
var match = regex.Match(line.ToString());
if (match.Success)
{
myProgressObject.ProgressType = ProgressType.FadingAudio
//... some calculations omitted for brevity
percentage = (int) Math.Round(result);
}
else
{
myProgressObject.ProgressType = ProgressType.UndefinedStep;
}
_backGroundWorker.ReportProgress(percentage, myProgressObject);
line.Clear();
}
else
{
line.Append(c[0]);
}
}

上面的代码似乎没有实时读取流,但会暂停输出一段时间。然后它发送一小块垃圾邮件,最后在过程中途陷入僵局。

任何指向正确方向的提示都将不胜感激!

更新(马虎?)解决方案:

这让我抓狂,因为我在 C# 方面的尝试似乎对结果没有任何影响。在更改 15 次并引入新的依赖项之前,我的原始实现很好。

问题仅出在 sox 和 RedirectStandardError 上。在获取 sox 源代码并构建我自己的版本后,我发现了这一点。首先,我完全删除了 sox 的所有输出,除了我真正感兴趣的内容,然后将输出更改为整行,然后是换行符 \n 。我以为这会解决我的问题。好吧,它没有。我不知道足够多的 c++ 来真正找出原因,但他们似乎已经缓和了 stdio 如何写入该流,它是如何缓冲的,或者以一种特殊的方式进行,以至于 c# 端的 streamreader 直到默认情况下才被刷新4096 字节缓冲区已满。我通过将每一行填充到至少 4096 字节来确认这一点。所以总而言之,我所要做的就是在每次 fprintf(stderr, ...) 调用 display_status(...) 后手动刷新 sox.c 中的 stderr:

fflush(stderr);

不过,我不确定这是否接近优雅的解决方案。

感谢 Erik Dietrich 的回答,让我从不同的角度看待这个问题。

最佳答案

您描述的情况是一个已知问题 - 有关包括源代码的解决方案,请参阅 http://www.codeproject.com/KB/threads/ReadProcessStdoutStderr.aspx

它解决了这两个问题(死锁和 \n 的问题)...

关于c# - 解析更新单个控制台行的进程的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7612524/

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