Laden...

Wie kann ich in einer Consolen-App mehrere Zeilen ohne flackern aktualisieren?

Erstellt von Duesmannr vor 3 Jahren Letzter Beitrag vor 3 Jahren 382 Views
D
Duesmannr Themenstarter:in
161 Beiträge seit 2017
vor 3 Jahren
Wie kann ich in einer Consolen-App mehrere Zeilen ohne flackern aktualisieren?

Nabend,

ich wusste nicht, in welchen Unterbereich ich es posten sollte. Falls es hier falsch ist, gerne verschieben.

Ausgangssituation:

  • Console Application .NET 5
  • Downloader von Files (in verschiedenen Threads)

Ziel:

  • Anzeigen vom aktuellen Status des Downloads
    (Name der Datei, wie viel wurde heruntergeladen in %, wie viel wurde heruntergeladen in double,
    wie groß ist die Datei)

Versuchte Lösungen:

Console.SetCursorPosition(x, y);
Console.Write("\rText");
  • Überschreiben der beschriebenen Zeilen mit Leerzeilen, weil das rewrite mit \r wohl laut stackoverflow nicht alle characters löscht.

Hier einmal der Code dazu:


public static void LogDownload(ITransferProgress progress, DownloadItem downloadItem)
        {
            string filename = Path.GetFileName(downloadItem.OutputPath);

            Console.SetCursorPosition(0, downloadItem.CursorTopPosition);

            string outputString = $"{filename}\t\t\t\t{progress.PercentComplete:P}\t|\t" +
                $"{progress.CurrentFileSize:0.##} {progress.CurrentFileSizeSuffix} / {progress.FileSize:0.##} {progress.FileSizeSuffix}";

            //ClearText(outputString, 0, downloadItem.CursorTopPosition);

            Console.Write($"\r{outputString}");
        }

        private static void ClearText(string text, int x, int y)
        {
            Console.SetCursorPosition(x, y);

            for (int i = 0; i < text.Length; i++)
            {
                Console.Write(" ");
            }

            Console.SetCursorPosition(x, y);
        }

Das ganze funktioniert auch halbwegs (flackert dann nur), wenn es nur eine Zeile ist. Nur wenn mehrere Zeilen geschrieben werden,
a) flackerts
b) der Text ist irgendwo, wo er nicht hin soll und doppelt

Hier auch einmal der Output mit mehreren Downloads. Output ist genau so, wie der oben genannte Code.

Wisst Ihr wie man das besser / performanter, ohne flackern und das alles richtig angezeigt wird umsetzen kann?

Ich gehe davon aus, dass ich zu viel neu schreibe, aber dann fällt mir auch keine andere Lösung ein.

Grüße

4.942 Beiträge seit 2008
vor 3 Jahren

Hallo,

bzgl. dem doppelten Text: das liegt daran, du du einen längeren Text mit einem kürzeren überschrieben möchtest, jedoch der Rest des längeren Textes noch sichtbar bleibt.

Du sollest deine Methode so abändern, daß sie nach dem Schreiben des Textes noch (MaxLength - CurrentTextLength) Leerzeichen dahinter schreibt (d.h. deine bisherige ClearText-Methode macht bisher so keinen Sinn, da du nur die Länge des aktuellen Textes berücksichtigt hast - und dieser dann mit dem eigentlichen Text sowieso wieder überschrieben wird).

Das Flackern liegt m.E. daran, wie oft du (pro Sekunde) den Text anzeigst.

F
10.010 Beiträge seit 2004
vor 3 Jahren

Neulich beim Hanselman diesen Blog gesehen, wäre das nicht was?
Spectre.Console lets you make beautiful console apps with .NET Core

D
Duesmannr Themenstarter:in
161 Beiträge seit 2017
vor 3 Jahren

@Th69 habe ich nach deiner Antwort auch versucht. Ändert nichts daran.
Hab aber herausgefunden das er "\t" nicht mag. Habe jetzt manuell mit Whitespaces gefüllt und es geht halbwegs.

Neulich beim Hanselman diesen Blog gesehen, wäre das nicht was?

>

Sieht auf dem 1. Blick sehr gut aus. Gucke ich mir an. Danke!