2012-12-18 29 views
0

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

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

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

    私人小组Server_Start_Click(发送者为对象,例如作为EventArgs的)把手Server_Start.Click 昏暗参数,server_admin_path作为字符串 server_admin_path =“d:\ Voice_App \ DataMessage \ MessageServer.exe” 参数= “-properties” & “” “” & “d:\ Voice_App \配置\ 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秒)之后,它将在控制台上生成日志跟踪,并且这将一直持续到消息服务器未被管理工具停止。所以现在我想要的是捕获我的服务器在其控制台上生成的每一行,并将该行粘贴到我窗口窗体上的文本框中。

我得到了下面的代码,给了我,每一个线和生产时,

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 =我的申请将被处理更多的是一个这样的服务器,我不希望用户在每次消息服务器实例在其任务栏上作为控制台窗口打开,并且它们正在滚动长日志跟踪。我在这里搜索了很多线程,但在上面的场景中没有任何工作。任何帮助将不胜感激,因为我很长时间以来一直坚持这一点,现在这是一个showstopper!

+0

那么基本上Textbox.Text&=“\ n”&e.Data然后呢?或者我误解了这个? – WozzeC

+0

感谢WozzeC为您的建议,但我试过与该死的文本框的一切,但没有运气。必须有一些不同的东西。感谢您的投入! – Stack2Heap

回答

2

看起来好像你正尝试从与窗体所在的线程不同的线程进行调用。从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 
+0

谢谢,user409762! 它正在按照我想要的方式工作。感谢您注意我的错误。谢谢 – Stack2Heap

+0

这可以完美地解决一个例外。我将文本附加到富文本框,该文本框使用.appendtext(),但是当它只在下一行的末尾添加一行时,如果我尝试在文本之后放置VBNewLine或VbCrLf或Environment.NewLine,我追加,我最终会在每个“输出”行之间增加一行。任何人都可以提供帮助。我认为在这里问问可能比开始一个新问题更容易。 – NapkinBob

+0

VBNewLine = chr(13)+ chr(10)= vbCr&vbLF 尝试仅使用vbCR或仅使用vbLF – shinobi92

相关问题