Konsolenausgabe während Eingabe anhalten

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Deniz12.

    Konsolenausgabe während Eingabe anhalten

    Hallo Gemeinde,
    erstmal hoff ich, dass das folgende noch zu den Grundlagen gehört, sonst bitte verschieben.
    Zum Problem:
    Ich habe eine Konsolenanwendung, die mit Console.WriteLine("Von der Console geschriebener Text") in unregelmäßigen Abständen etwas in das Konsolenfenster schreibt. Jetzt nimmt die Anwendung aber auch Eingaben an. Gibt man nun z.B. "Hallo Welt!" ein und im demselben Moment, wenn man "Welt" schreiben will, kommt eine Ausgabe an, so steht im Fenster "Hallo Von der Console geschriebener Text"

    Gibt es da eine Möglichkeit, die Ausgabe, also Console.WriteLine(...) anzuhalten, solange Text (z.B. "Hallo Welt")im Fenster steht? Gibt es vllt eine Alternative dazu?
    Ich steh da grad bissl aufm Schlauch, als wär toll wenn ihr mir helfen könntet.

    Vielen Dank allen Helfern :)
    Wie sieht denn der Cosde aus, der solch generiert?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    und die Events treten sicherlich in einem NebenThread auf.

    Im HauptThread können sie nicht auftreten, denn dieser ist blockiert durch .ReadLine(), und das würde auch die Events blockieren.

    Was aber soll mit den Events passieren, wenn es gelingt, die ReadLine-Funktion vom Dazwischenfunken freizumachen?

    Sollen die Meldungen der Events verfallen, oder sollen sie zwischen-gespeichert werden, bis Readline beendet ist (und dann alle auf einmal sich inne Console ergießen)?

    Man kann auch den Nebenthread blockieren - keine Ahnung, was das für Auswirkungen auf den Sender dieser Meldungen hat - vlt. unproblematisch.
    Bau dir eine MessageQueue als zwischenspeicher:

    VB.NET-Quellcode

    1. Private WithEvents t As New NebenThread
    2. Sub Main()
    3. Dim tmp As String = ""
    4. Do Until tmp = "exit"
    5. 'Vor dem ReadLine wird die Sperre (Lock) gesetzt
    6. 'Damit der NebenThread nicht schreiben kann
    7. Lock = True
    8. tmp = Console.ReadLine
    9. Lock = False
    10. t_Write()
    11. Threading.Thread.Sleep(8000)
    12. Loop
    13. End Sub
    14. Private Lock As Boolean = False
    15. 'Dieses Event wird ausgelöst, wenn eine Nachricht vom Nebenthread in die Queue geschrieben wurde
    16. 'Wenn Lock auf False ist, werden alle in Nachrichten, die sich in der Queue befinden, in die Console geschrieben.
    17. Private Sub t_Write(ByVal Message As String) Handles t.Write
    18. 'Leere Nachrichten kommen nicht in die Queue
    19. If Not String.IsNullOrEmpty(Message) Then
    20. _q.Enqueue(Message)
    21. End If
    22. If Not Lock Then
    23. Do Until _q.Count <= 0
    24. Console.WriteLine(_q.Dequeue)
    25. Loop
    26. End If
    27. End Sub
    28. Private _q As New Queue(Of String)
    29. 'Dieser Thread schreibt alle 5 Sekunden den Text "test" in die Queue und löst das Event Write aus
    30. Class NebenThread
    31. Sub New()
    32. Dim t As New Threading.Thread(AddressOf run)
    33. t.Start()
    34. End Sub
    35. Public Property abort As Boolean = False
    36. Public Event Write(ByVal Message As String)
    37. Sub run()
    38. Do Until abort
    39. Threading.Thread.Sleep(5000)
    40. RaiseEvent Write("test")
    41. Loop
    42. End Sub
    43. End Class
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    @Biedermanns: Hmm.
    Du servierst bereits eine Lösung, bevor der TE sich ühaupt auch nur einen Gedanken zum Konzept gemacht hat:

    ErfinderDesRades schrieb:

    Was aber soll mit den Events passieren, wenn es gelingt, die ReadLine-Funktion vom Dazwischenfunken freizumachen?

    Das entmündigt und verblödet, ums krass auszudrücken.
    @ BiedermannS
    Vielen Dank für den Code. Ich werde ihn in Teilen übernehmen und ihn an meine Bedürfnisse anpassen. Nochmals vielen Dank :)
    @ErfinderDesRades
    Natürlich hast du recht, dass C&P nicht die richtige Lösung ist. Auch stimmt, dass das Schreiben aus einem Nebenthread erfolgt. Ich werde den Code, wie bereits geschrieben nur in Teilen verwenden, damit ich auch was dazugetan habe :)

    Damit ist mein Problem erledigt, vielen Dank an alle Helfer :D