2

我正在尝试编写一个运行 Perl 脚本并读取和使用标准输出的 VB .NET 程序。我希望能够在打印时单独处理每一行,并相应地更新我的程序显示。这是我“编写”的一些代码(阅读:“主要从互联网上复制”):

Private WithEvents pscript As Process

Private Sub myProgram_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    pscript = New Process()
    pscript.StartInfo.CreateNoWindow = True
    pscript.StartInfo.FileName = "C:\perl64\bin\perl.exe"
    pscript.StartInfo.Arguments = "C:\test.pl"
    pscript.StartInfo.UseShellExecute = False
    pscript.StartInfo.RedirectStandardOutput = True
    pscript.StartInfo.RedirectStandardInput = True
    AddHandler pscript.OutputDataReceived, AddressOf pscript_output_process
    pscript.Start()
    pscript.BeginOutputReadLine()
End Sub

Private Sub pscript_output_process(sender As Object, e As DataReceivedEventArgs)
    MessageBox.Show(e.Data)
End Sub

这适用于一个问题:程序一直等到测试脚本运行完成,然后一个接一个地触发几个 OutputDataReceived 事件。这意味着当我让它使用真实的脚本时,它可能会在长达几个小时内什么都不做,然后必须同时处理 5,000 个事件,尽管事实上是以相当固定的时间间隔打印的东西在那段时间。

有什么办法可以让它在编写时处理每一行文本,而不是在最后一次处理所有文本?

4

2 回答 2

1

我想出了如何通过从互联网上复制更多东西来解决它。问题似乎出在 Perl 中,它通常不会在每个打印语句之后刷新标准输出。我真的不知道最后一句是什么意思,但无论如何,将这一行添加local $| = 1;到脚本的顶部(根据我阅读的网站,这使得它自动刷新标准输出)解决了这个问题。

于 2012-04-28T07:05:33.550 回答
0
While (pscript.HasExited = False)
    Dim sLine As String = pscript.StandardOutput.ReadLine
End While
于 2012-04-27T22:56:37.857 回答