Wie reserviere ich eine Zeile für die Eingabe in der Multithread-Konsole?

8

Diese Frage hat mich schon eine Weile gestört, und mir ist klar, dass es schwer ist zu beschreiben, wonach ich suche. Ich möchte in der Lage sein, eine Zeile für die Texteingabe in einer C # -Konsolenanwendung zu reservieren, während andere Informationen in den verbleibenden Zeilen aktualisiert werden können. Genauer gesagt möchte ich ein kleines Schlammspiel machen, bei dem das Spiel aktualisiert wird, auch wenn der Benutzer gerade dabei ist, Eingaben zu machen. Es ist wichtig, dass die Eingabe den Informationsfluss nicht blockiert.

Ich möchte den Effekt erreichen, dass der Benutzer die Eingabe in die letzte sichtbare Zeile auf dem Bildschirm schreibt, während der andere Text wie gewohnt anfügt, aber nicht in meiner Eingabezeile nach unten scrollt oder sie überschreibt.

Wenn ich dies in Form von Formularen beschreiben würde, würde ich mir vorstellen, dass eine mehrzeilige Textbox als oberer Teil für die Information verwendet wird, mit einem einzeiligen Textfeld unten für die Eingabe.

>     
Statement 24.04.2011, 17:52
quelle

3 Antworten

6

Eine Option, die Sie ausprobieren könnten, ist, den Konsolenpuffer direkt zu manipulieren, um Ihren Spielbereich zu rendern und den Cursor mit der Console.SetCursorPosition auf die Eingabezeile zu positionieren, wo Sie beispielsweise Console.ReadLine verwenden.

Da die direkte Manipulation des Puffers die Cursorposition nicht beeinflusst und unabhängig von der Konsol-Lese- / Schreibfunktion ist, kann ein Thread den Konsolenpuffer aktualisieren, der die ersten 24 Zeilen abdeckt und die 25 Zeile auf Eingabe wartet. Wenn ich etwas Zeit bekomme, werde ich versuchen, ein Beispiel zu erstellen, was ich meine, aber in der Zwischenzeit können Sie auf die anderen Antworten verweisen, die ich für einen Zeiger zum Schreiben direkt in den Konsolenpuffer bereitgestellt habe.

Wie kann ich schnelle farbige Ausgabe schreiben? zur Konsole?

Löschen zuvor geschriebener Zeilen in der Konsole

Natürlich wirst du einige nette Wrapper-Funktionen schreiben wollen, um das zu vereinfachen, ich denke immer daran, das zu tun, ich mache einfach nicht genug Arbeit mit der Konsole, so dass ich tatsächlich runtergehe und etwas mache.

Update: Es wurde ein kleines Beispiel hinzugefügt, bei dem die Konsole in einem Thread aktualisiert wird, während Benutzereingaben weiterhin akzeptiert werden. Geben Sie einfach "quit" ein, um die Ausführung zu stoppen. Beachten Sie, dass die ConsoleBuffer-Klasse nicht ideal ist. Ich schließe das Konsolenhandle nicht, es war nur ein kurzer Code für die Demo.

%Vor%     
Chris Taylor 27.04.2011 19:01
quelle
1

Die dotNet-Konsole unterstützt SetCursorPosition() und Sie verwenden auch den alten DOS-Trick, eine Zeile mit \r anstelle von \n\r zu beenden.

Aber Multi-Threading und Append klingen nicht wie eine gute Kombination.

    
Henk Holterman 24.04.2011 19:38
quelle
1

Sehen Sie sich diese .NET-Bindungen für Flüche an

Ссылка

ncurses ist offensichtlich eine UNIX-Erfindung, aber die APIs sind meist plattformübergreifend (Ich habe die .NET-Bindungen nicht selbst ausprobiert, habe aber im Allgemeinen sehr gute Ergebnisse mit ncurses erzielt).

Dies wird absolut die Waren enthalten, die Sie brauchen und mehr

    
sehe 24.04.2011 19:47
quelle