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

如何在运行时使用vb.net 2012将控制台应用程序的输出重定向到windows窗体上的Textbox控件,vb.net,Vb.net,团队 我有一个第三方应用程序,它实际上是一个电话消息服务器,在所有连接的客户端和其他服务器之间交换消息。此消息服务器持续运行数天甚至数月。这完全是一个控制台应用程序,没有任何GUI。即使要管理此服务器的内部操作,也有另一个工具,即基于控制台的应用程序。我想准备一个GUI在VB.NET2012中启动、停止和重新启动此服务器。我设法做到了, 创建此服务器的进程实例 使用适当的参数启动服务器并保持其运行。下面是我的应用程序中启动服务器的一些示例代码 专用子服务器\u启动\u单击(发送方作为对象,e作为

团队

我有一个第三方应用程序,它实际上是一个电话消息服务器,在所有连接的客户端和其他服务器之间交换消息。此消息服务器持续运行数天甚至数月。这完全是一个控制台应用程序,没有任何GUI。即使要管理此服务器的内部操作,也有另一个工具,即基于控制台的应用程序。我想准备一个GUI在VB.NET2012中启动、停止和重新启动此服务器。我设法做到了,

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

    专用子服务器\u启动\u单击(发送方作为对象,e作为事件参数)处理服务器\u启动。单击 Dim参数,服务器\管理\路径为字符串 server\u admin\u path=“D:\Voice\u App\DataMessage\MessageServer.exe” parameter=“-properties”和“&”D:\Voice\u App\Config\message.prop”

    端接头

  • 这段代码可以很好地启动消息服务器。消息服务器现在已启动,并在特定时间间隔(如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=我的应用程序将处理多个这样的服务器,我不希望用户将任务栏上的每个消息服务器实例作为控制台窗口打开,并滚动长日志跟踪。我在这里搜索了很多线程,但在上面的场景中没有任何东西对我有效。任何帮助都将不胜感激,因为我已经被困在这个问题上很长时间了,现在这是一个止步

    看起来您正在尝试从与窗体所在线程不同的线程进行调用。从进程类引发的事件将不会来自同一线程

    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
    

    看起来您正在尝试从与窗体所在线程不同的线程进行调用。从进程类引发的事件将不会来自同一线程

    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
    

    那么基本上是Textbox.Text&=“\n”&e.数据吗?还是我误解了这一点?谢谢WozzeC的建议,但我用那个该死的文本框尝试了一切,但没有运气。一定有不同的东西。谢谢你的意见!!那么基本上是Textbox.Text&=“\n”&e.数据吗?还是我误解了这一点?谢谢WozzeC的建议,但我用那个该死的文本框尝试了一切,但没有运气。一定有不同的东西。谢谢你的意见!!谢谢你,用户409762!!它正按照我想要的方式工作。谢谢你指出我的错误。。谢谢。除了一个例外,这工作做得很好。我将文本追加到一个富文本框中,该框使用.appendtext()工作,但当它仅将一行添加到下一行的末尾时,如果我尝试在追加的文本后放置VBNewLine或VbCrLf或Environment.NewLine,则在每个“输出”行之间会有一行额外的内容。有人能帮忙吗。我想在这里提问可能比开始一个新问题更容易。VBNewLine=chr(13)+chr(10)=vbCr&vbLF尝试仅使用vbCr或仅使用vbLF谢谢,用户409762!!它正按照我想要的方式工作。谢谢你指出我的错误。。谢谢。除了一个例外,这工作做得很好。我将文本追加到一个富文本框中,该框使用.appendtext()工作,但当它仅将一行添加到下一行的末尾时,如果我尝试在追加的文本后放置VBNewLine或VbCrLf或Environment.NewLine,则在每个“输出”行之间会有一行额外的内容。有人能帮忙吗。我想在这里提问可能比开始一个新问题更容易。VBNewLine=chr(13)+chr(10)=vbCr&vbLF尝试仅使用vbCr或仅使用vbLF