標準出力をテキストボックスに割り当てるには?

解決


51  2009-06-09 21:20:32  No: 142037  IP: 192.*.*.*

Process.Startで起動したアプリケーションの標準出力をテキストボックスに割り当てたいと考えています。一応調べてはみたのですが、多くのものは、

Dim output As String = Process**.StandardOutput.ReadToEnd()

としてoutputをTextBox.Textに出力するといったものでした。これですと、計算終了後にテキストボックスに表示されますが、今、行いたいのは、計算の途中経過を随時出力させる(モニターしたい)というものです。
現在の使用環境は、WindowsXp+Visual Studio 2005で、上記のアプリケーションはFortranで作ったものです。

Fortran世代でVBやC++など全くの素人なので、質問自体がおかしいのかもしれませんが、よろしくお願いいたします。

編集 削除
もげ  2009-06-10 08:56:06  No: 142038  IP: 192.*.*.*

ReadToEndではなく
ReadLine(行単位で読む)ではどうでしょう?

編集 削除
魔界の仮面弁士  2009-06-10 09:07:04  No: 142039  IP: 192.*.*.*

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

編集 削除
51  2009-06-10 19:59:53  No: 142040  IP: 192.*.*.*

もげさま、魔界の仮面弁士さま、早々のご回答ありがとうございました。
大変参考になりました。魔界の仮面弁士さんのコードを直接、私のプログラムに挿入したとき、うまくいかなかったので、多少あせったのですが、私の決定的な間違いは(今考えれば当り前のような気もしますが)ジョブが終了したことを認識するために、p.WaitToEndをBeginOutputReadLine()の後に書き込んでいたのが原因でした。この行をコメントアウトしたらうまく動きました。こんな間違いをしている程度の知識しかない私ですので、丁寧にコードまで書いていただいたお陰で非常に助かりました。本当にありがとうございました。失礼いたします。

編集 削除