Process.Startで起動したアプリケーションの標準出力をテキストボックスに割り当てたいと考えています。一応調べてはみたのですが、多くのものは、
Dim output As String = Process**.StandardOutput.ReadToEnd()
としてoutputをTextBox.Textに出力するといったものでした。これですと、計算終了後にテキストボックスに表示されますが、今、行いたいのは、計算の途中経過を随時出力させる(モニターしたい)というものです。
現在の使用環境は、WindowsXp+Visual Studio 2005で、上記のアプリケーションはFortranで作ったものです。
Fortran世代でVBやC++など全くの素人なので、質問自体がおかしいのかもしれませんが、よろしくお願いいたします。
ReadToEndではなく
ReadLine(行単位で読む)ではどうでしょう?
OutputDataReceived イベントを試してみてください。
Public Class Form1
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Dim psi As New ProcessStartInfo()
psi.FileName = Environ("ComSpec")
psi.RedirectStandardInput = False
psi.RedirectStandardOutput = True
psi.UseShellExecute = False
psi.CreateNoWindow = False 'True
psi.Arguments = "/C DIR ""C:\Program Files\"""
psi.ErrorDialog = True
TextBox1.Clear()
Dim p As Process = Process.Start(psi)
AddHandler p.OutputDataReceived, AddressOf Received
p.BeginOutputReadLine()
End Sub
Delegate Sub AppendTextInvoker(ByVal S As String)
Private Sub Received(ByVal sender As Object, ByVal e As DataReceivedEventArgs)
If e.Data IsNot Nothing Then
BeginInvoke(New AppendTextInvoker(AddressOf TextBox1.AppendText), e.Data & vbCrLf)
End If
End Sub
End Class
もげさま、魔界の仮面弁士さま、早々のご回答ありがとうございました。
大変参考になりました。魔界の仮面弁士さんのコードを直接、私のプログラムに挿入したとき、うまくいかなかったので、多少あせったのですが、私の決定的な間違いは(今考えれば当り前のような気もしますが)ジョブが終了したことを認識するために、p.WaitToEndをBeginOutputReadLine()の後に書き込んでいたのが原因でした。この行をコメントアウトしたらうまく動きました。こんな間違いをしている程度の知識しかない私ですので、丁寧にコードまで書いていただいたお陰で非常に助かりました。本当にありがとうございました。失礼いたします。
ツイート | ![]() |