如何使用vb.net 2012在运行时将控制台应用程序的输出重定向到Windows窗体上的Textbox控件

时间:2012-12-18 09:45:18

标签: vb.net

我有第三方应用程序,它实际上是电话消息服务器,并在所有连接的客户端和其他服务器之间交换消息。此消息传递服务器持续运行了几天甚至是飞蛾。这完全是一个控制台应用程序,没有任何GUI。即使要管理此服务器的内部操作,还有另一个工具,它再次是基于控制台的应用程序。我想在VB.Net 2012中准备一个GUI来启动,停止和重启这个服务器。我已经成功了,

  1. 创建此服务器的流程实例
  2. 使用适当的参数启动服务器并使其保持运行。下面是我的应用程序启动服务器的一些示例代码,

    Private Sub Server_Start_Click(发件人作为对象,e作为EventArgs)处理Server_Start.Click     Dim参数,server_admin_path As String     server_admin_path =“D:\ Voice_App \ DataMessage \ MessageServer.exe”     parameter =“ - property”& “”“& “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()
    

    结束子

  3. 此代码可以很好地启动消息服务器。消息服务器现在已启动,并且在特定的间隔时间(例如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
    

    P.S =我的应用程序将处理更多这样的服务器,我不希望用户将其任务栏上的每个消息服务器实例打开为控制台窗口,并且它们滚动长日志跟踪。我在这里搜索了很多线程,但在上面的场景中没有任何工作。任何帮助都会非常感激,因为我很长时间以来一直坚持这一点,这现在是一个showstopper !!!!

1 个答案:

答案 0 :(得分: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