0

チーム、

私は、実際にはテレフォニック メッセージング サーバーであるサード パーティ アプリケーションを使用しており、接続されているすべてのクライアントと他のサーバー間でメッセージを交換しています。このメッセージング サーバーは、数日間、場合によっては数か月にわたって稼働し続けます。これは完全にコンソール アプリケーションであり、GUI はありません。このサーバーの内部操作を管理するためにも、コンソール ベースのアプリケーションである別のツールがあります。VB.Net 2012 でこのサーバーを起動、停止、再起動するための GUI を準備したいと思います。

  1. このサーバーのプロセス インスタンスを作成します
  2. 適切なパラメーターを使用してサーバーを起動し、実行を続けます。以下は、サーバーを起動するためのアプリケーションのサンプル コードです。

    Private Sub Server_Start_Click(sender As Object, e As EventArgs) Handles Server_Start.Click Dim parameter, server_admin_path As String server_admin_path = "D:\Voice_App\DataMessage\MessageServer.exe" parameter = " -properties " & """" & " D :\Voice_App\Config\message.prop"

    Dim proc = New Process()
    proc.StartInfo.FileName = server_admin_path
    proc.StartInfo.Arguments = parameter
    ' set up output redirection
    proc.StartInfo.RedirectStandardOutput = True
    proc.StartInfo.RedirectStandardError = True
    proc.EnableRaisingEvents = True
    Application.DoEvents()
    proc.StartInfo.CreateNoWindow = False
    proc.StartInfo.UseShellExecute = False
    ' see below for output handler
    AddHandler proc.ErrorDataReceived, AddressOf proc_OutputDataReceived
    AddHandler proc.OutputDataReceived, AddressOf proc_OutputDataReceived
    proc.Start()
    proc.BeginErrorReadLine()
    proc.BeginOutputReadLine()
    'proc.WaitForExit()
    Server_Logs.Focus()
    

    サブ終了

このコードは、メッセージ サーバーを非常にうまく起動します。メッセージ サーバーが開始され、特定の間隔 (たとえば 30 秒) が経過した後、コンソールにログ トレースが生成されます。これは、メッセージ サーバーが管理ツールによって停止されなくなるまで続きます。だから今私が欲しいのは、サーバーによって生成されているすべての行をコンソールにキャプチャし、その行を Windows フォームにあるテキストボックスに貼り付けることです。

以下のコードを取得すると、すべての行が生成されたときに、

   Public Sub proc_OutputDataReceived(ByVal sender As Object, ByVal e As                     DataReceivedEventArgs)
    On Error Resume Next
    ' output will be in string e.Data
    ' modify TextBox.Text here
    'Server_Logs.Text = e.Data  ` Does not display anything in textbox
    MsgBox(e.Data) 'It works but I want output in text box field
End Sub

PS = 私のアプリケーションはそのようなサーバーを複数処理する予定であり、ユーザーがすべてのメッセージ サーバー インスタンスをコンソール ウィンドウとしてタスクバーに開いて、長いログ トレースをスクロールすることを望んでいません。ここで多くのスレッドを検索しましたが、上記のシナリオでは何も機能しませんでした。私は非常に長い間これに固執しており、これは今やショーストッパーであるため、どんな助けも大歓迎です!!!!

4

1 に答える 1

3

フォームが存在するスレッドとは異なるスレッドから呼び出しを行おうとしているようです。Process クラスから発生したイベントは、同じスレッドからのものではありません。

Delegate Sub UpdateTextBoxDelg(text As String)
Public myDelegate As UpdateTextBoxDelg = New UpdateTextBoxDelg(AddressOf UpdateTextBox)

Public Sub UpdateTextBox(text As String)
    Textbox.Text = text
End Sub

Public Sub proc_OutputDataReceived(ByVal sender As Object, ByVal e As DataReceivedEventArgs)

    If Me.InvokeRequired = True Then
        Me.Invoke(myDelegate, e.Data)
    Else
        UpdateTextBox(e.Data)
    End If

End Sub
于 2012-12-18T15:33:50.290 に答える