Bei Process.StandardError.ReadLine() nicht auf Eingaben warten

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von chrismueller.

    Bei Process.StandardError.ReadLine() nicht auf Eingaben warten

    Ich bin gerade dabei, ein Tray-Icon für CraftBukkit zu programmieren.
    Also wird Java mit Parametern als neuer Prozess mit folgendem Code gestartet:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private WithEvents Server As Process
    2. [...]
    3. Server = New Process
    4. Server.StartInfo.WorkingDirectory = "[...]\Bukkit\"
    5. Server.StartInfo.FileName = "[...]\java.exe"
    6. Server.StartInfo.Arguments = "-jar ""[...]\Bukkit\craftbukkit.jar"""
    7. Server.StartInfo.RedirectStandardError = True
    8. Server.StartInfo.UseShellExecute = False
    9. Server.StartInfo.CreateNoWindow = True
    10. Server.Start()


    Ich möchte gerne alle X Sekunden ein Balloon-Tip (über das System.Windows.Forms.NotifyIcon "TrayIcon") mit den letzten Ausgaben des Servers anzeigen. Mein aktueller Lösungsansatz sieht wiefolgt aus:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim t As New Threading.Thread(Sub() Thrd())
    2. [...]
    3. t.Start()
    4. [...]
    5. Private Sub Thrd()
    6. While 1
    7. System.Threading.Thread.Sleep(2000)
    8. Dim rln As String = Server.StandardError.ReadLine()
    9. Dim rl As String = rln
    10. rln = Server.StandardError.ReadLine()
    11. While Not rln = Nothing
    12. rl = rl & vbCrLf & rln
    13. rln = Server.StandardError.ReadLine()
    14. End While
    15. TrayIcon.ShowBalloonTip(1000, "Serverstatus", rl, ToolTipIcon.Info)
    16. End While
    17. End Sub


    Das Problem: Wenn alles eingelesen wurde, ist rln immer noch nicht Nothing , sondern er wartet, bis eine neue Zeile eingegeben wurde. X(
    Mit ReadToEnd() und Read() dasselbe Problem.
    Wie kann man es hinbekommen, dass er nicht auf eine Eingabe wartet, sondern einfach weiter macht? Eingeben kann man ja nichts, weil kein Fenster angezeigt wird, und außer einem unschönen Extrathread der dann eine leere Zeile ans Programm sendet fällt mir auch nichts ein.
    Das geht wohl mit irgendwelchen Asynchronen Events, aber das verstehe ich nicht so richtig und das Beispiel auf MSDN ist ziemlich unübersichtlich. 8|

    Edit by der_Kurt:
    Die Farbe Rot ist nur für die Moderation zulässig --> Boardregeln
    * Beitrag wurde editiert *

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „der_Kurt“ ()

    dann probier es doch mal mit events?
    msdn.microsoft.com/de-de/library/8zb6cw9w

    is m.M. schöner :) ich hab jetzt leider gerade nur ein C# bsp aber vll kannst du es ja nachvollziehn ...

    Quellcode

    1. // process einstellungen etc...
    2. Process process = new Process();
    3. process.StartInfo = processStartInfo;
    4. bool processStarted = process.Start();
    5. process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);
    6. process.BeginOutputReadLine();

    Quellcode

    1. static void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
    2. {
    3. System.Diagnostics.Debug.Write(e.Data);
    4. }
    Vielen Dank slice!
    Endlich verstehe ich das mit BeginOutputReadLine.

    Das ganze habe ich jetzt so gelöst:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Server.BeginErrorReadLine()
    2. Server.BeginOutputReadLine()
    3. PutOut.Start()
    4. [...]
    5. Dim Puffer As String
    6. [...]
    7. Dim PutOut As New Threading.Thread(AddressOf Thread_PutOut)
    8. Delegate Sub AddToLog()
    9. Dim POd As AddToLog = New AddToLog(AddressOf PutOutD)
    10. Private Sub Thread_PutOut()
    11. Do
    12. System.Threading.Thread.Sleep(2500)
    13. Dim PufferChk = System.Text.RegularExpressions.Regex.Replace(Puffer, "\s*", "")
    14. If Not PufferChk = "" Then
    15. If Log.InvokeRequired Then
    16. Log.Invoke(POd)
    17. Else
    18. PutOutD()
    19. End If
    20. If Puffer.Length > 252 Then
    21. TrayIcon.ShowBalloonTip(2500, "ÜHBERSCHIHFD :P", "..." & Puffer.Substring(Puffer.Length - 252), ToolTipIcon.Info)
    22. Else
    23. TrayIcon.ShowBalloonTip(2500, "ÜHBERSCHIHFD :P", Puffer, ToolTipIcon.Info)
    24. End If
    25. Puffer = ""
    26. Else
    27. Puffer = ""
    28. End If
    29. Loop
    30. End Sub
    31. Private Sub FlushPufferD()
    32. For Each l In Puffer.Split(vbCrLf.ToCharArray, StringSplitOptions.RemoveEmptyEntries)
    33. Log.Items.Add(l)
    34. Next
    35. End Sub