私は、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件のイベントを処理する必要があることを意味しますその間ずっと。
最後に一度にすべてを書き込むのではなく、書かれているときに各行のテキストを処理する方法はありますか?
リダイレクトstdout。 – dubvfan87
これはおそらくここでもそこにはないが、ヘルプドキュメントには「非同期出力を処理しているアプリケーションがWaitForExitメソッドを呼び出して、出力バッファがフラッシュされていることを確認する必要があります」というメッセージが繰り返し表示されます。 –
Jim:WaitForExitを呼び出すと、スクリプトが完了するまで完全にフリーズし、それ以外の場合は同じ方法で動作します。 – gorcq