2012-04-27 5 views
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件のイベントを処理する必要があることを意味しますその間ずっと。

最後に一度にすべてを書き込むのではなく、書かれているときに各行のテキストを処理する方法はありますか?

+0

リダイレクトstdout。 – dubvfan87

+0

これはおそらくここでもそこにはないが、ヘルプドキュメントには「非同期出力を処理しているアプリケーションがWaitForExitメソッドを呼び出して、出力バッファがフラッシュされていることを確認する必要があります」というメッセージが繰り返し表示されます。 –

+0

Jim:WaitForExitを呼び出すと、スクリプトが完了するまで完全にフリーズし、それ以外の場合は同じ方法で動作します。 – gorcq

答えて

0
While (pscript.HasExited = False) 
    Dim sLine As String = pscript.StandardOutput.ReadLine 
End While 
+0

何らかの理由で、これは印刷された最初の行だけを捕捉し、スクリプトが完了するまで待ちます。また、スクリプトが実行されている間に私のプログラムがフリーズするので、イベントベースのメソッドが好きなのです(それがうまくいけば!)。 – gorcq

1

インターネットから多くのものをコピーして修正する方法を見つけました。この問題は、通常は各print文の後に標準出力をフラッシュしないPerlにあったようです。私は最後の文が何を意味するのか本当に分かっていませんが、とにかく、スクリプトの先頭にlocal $| = 1;という行を追加すると(私が読んだサイトによれば、自動的に標準出力がフラッシュされます)、問題が修正されます。

+0

"Flush standard output"はちょっとした説明です。それは "STDOUTのためにバッファをフラッシュする"と言うべきです。効率を上げるため、デフォルトで高速RAMバッファが使用されます。バッファが満杯または手動で空になった(「フラッシュされた」)場合にのみ、データがストリーム(ファイル、端末、ソケット)に入れられます。 ['$ |'](http://p3rl.org/var#%24%7c)を設定すると、バッファリングがオフに切り替わります。 (私の説明は少し間違っていますが、要点は真です;詳細は言及するには十分なスペースがありません)。[Buffering from Suffering from Buffering?](http://perl.plover.com/FAQs/Buffering.html)for拡張された議論。 – daxim

+0

記事ありがとうございます。これは今より多くの意味があります。 – gorcq

関連する問題