2013-09-22 127 views
3

我寫一個應用程序來管理其他控制檯應用程序(遊戲服務器 - jampded.exe)當它在控制檯中運行寫入數據,並沒有問題讀取命令控制檯應用程序並不想讀取標準輸入

在我的應用程序重定向標準I/O操作的StreamWriter和StreamReader的

Public out As StreamReader 
Public input As StreamWriter 

Dim p As New Process() 
p.StartInfo.FileName = My.Application.Info.DirectoryPath & "\" & 
         TextBox6.Text 'PATH TO JAMPDED.EXE 
p.StartInfo.Arguments = TextBox1.Text 'EXTRA PARAMETERS 
p.StartInfo.CreateNoWindow = True 
p.StartInfo.RedirectStandardInput = True 
p.StartInfo.RedirectStandardOutput = True 
p.StartInfo.UseShellExecute = False 
p.Start() 

input = p.StandardInput 
out = p.StandardOutput 

Dim thr As Thread = New Thread(AddressOf updatetextbox) 
thr.IsBackground = True 
thr.Start() 

Sub updatetextbox() 
    While True 
    While Not out.EndOfStream 
     RichTextBox1.AppendText(out.ReadLine()) 
     RichTextBox1.AppendText(vbNewLine) 
    End While 
    End While 
End Sub 

Private Sub Button2_Click(sender As Object, e As EventArgs) _ 
                 Handles Button2.Click 
    input.WriteLine(TextBox4.Text) 
    TextBox4.Text = "" 
    input.Flush() 
End Sub 

當我按下Button2應該寫STD /我的文字從我的文本框,jampded.exe行爲就像是不寫。此外,輸出在啓動時運行良好,之後在緩衝區中存在大量數據時很少添加新行。

我做錯了什麼,還是應用程序的錯?

回答

2

對於標準輸入問題:

你肯定,你啓動應用程序是從標準輸入讀取數據(而不是捕捉鍵盤事件或某事)?爲了測試這個,把一些你想要發送給應用程序的文本放在一個文本文件中(例如命名爲commands.txt)。如果該應用程序讀取這些命令

type commands.txt | jampded.exe

,則確實從標準輸入讀取:然後,它從一個命令提示發送到應用程序,像這樣。如果不是,那麼重定向標準輸入不會幫助您獲取該應用程序的數據。

對於標準輸出的問題:

而不是推出自己的線程來處理來自其他應用程序來的數據,我建議做這樣的事情:

AddHandler p.OutputDataReceived, AddressOf OutputData 
p.Start() 
p.BeginOutputReadLine() 

Private Sub AddLineToTextBox(ByVal line As String) 
    RichTextBox1.AppendText(e.Data) 
    RichTextBox1.AppendText(vbNewLine) 
End Sub 
Private Delegate Sub AddLineDelegate(ByVal line As String) 

Private Sub OutputData(ByVal sender As Object, ByVal e As DataReceivedEventArgs) 
    If IsNothing(e.Data) Then Exit Sub 
    Dim d As AddLineDelegate 
    d = AddressOf AddLineToTextBox 
    Invoke(d, e.Data) 
End Sub 

Invoke調用是必需的因爲OutputData可能會在不同的線程上調用,並且UI更新都必須在UI線程上發生。

我直接從StandardOutput流中讀取數據時遇到了同樣的問題。異步讀取+事件處理程序組合固定它。

+0

感謝您的回覆+1。儘管我發現了STD輸入的解決方法,但即使使用您的代碼,標準輸出仍然大大延遲。 – Disa

相關問題