2012-12-18 56 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

相關問題