2016-04-26 12 views
-2

Was ich gerade lese Logfile Datensätze in die Konsole. Ich möchte eine Fortschrittsbalken in der Unterseite und zeigt den Fortschritt.C# Console immer Fortschrittsbalken auf der Unterseite

Problem ist: der Update-Datensatz wird die Fortschrittsleiste überschreiben.

 private static void DrawProgressBar(int complete, int maxVal, int barSize, char progressCharacter) 
    { 
     Console.CursorVisible = false; 
     int left = Console.CursorLeft; 
     //int top = Console.CursorTop; 

     //Console.CursorTop = Console.WindowTop + Console.WindowHeight - 1; 

     decimal perc = (decimal)complete/(decimal)maxVal; 
     int chars = (int)Math.Floor(perc/((decimal)1/(decimal)barSize)); 
     string p1 = String.Empty, p2 = String.Empty; 

     for (int i = 0; i < chars; i++) p1 += progressCharacter; 
     for (int i = 0; i < barSize - chars; i++) p2 += progressCharacter; 

     Console.ForegroundColor = ConsoleColor.Green; 
     Console.Write(p1); 
     Console.ForegroundColor = ConsoleColor.DarkGreen; 
     Console.Write(p2); 

     Console.ResetColor(); 
     Console.Write(" {0}%", (perc * 100).ToString("N2")); 
     Console.CursorLeft = left; 
     //Console.SetCursorPosition(left, top); 
    } 
+1

Willkommen zu Stack-Überlauf Bitte lesen Sie [wie Sie fragen] (http://StackOverflow.com/Help/How-to-ask), da hier keine Frage steht. – BugFinder

Antwort

0

Sie müssen den Cursor auf die richtige Position setzen.

Hier ist ein einfaches Beispiel für SetCursorPosition:

 for (int i = 0; i < 10; i++) { 
      Console.SetCursorPosition(0, 0); 
      Console.Write("i = {0}", i); 
      System.Threading.Thread.Sleep(1000); 
     } 

Bevor Sie die progressbar Sie müssen drucken um herauszufinden, wo Sie den Cursor starten und Zurücksetzen vor dem progressbar zu schreiben.

+0

Danke für Ihre Antwort. :) – user3461613

0

Es gibt einen einfachen Weg, dies zu tun und mehrere sehr schwierige Wege, dies zu tun.

Der einfache Weg ist, den Fortschrittsbalken nach jedem Anruf erneut anzuzeigen . Auf diese Weise ist es egal, ob eine gescrollte Linie den Fortschrittsbalken überschreibt, weil Sie ihn nur erneut anzeigen.

Wenn Sie Lust haben, müssen Sie selbst scrollen. Das bedeutet, dass Sie einen TextWriter Nachkommen erstellen, der Sie in die letzte Zeile schreiben kann (wo die Statuszeile ist), und wenn immer ein Code in die untere Zeile schreiben will, wo sich die Fortschrittsanzeige befindet, scrollen Sie den Rest des Bildschirms Schreibe die neue Zeile in den freien Platz.

Es gibt einige Probleme mit dem zweiten Ansatz, der erste ist, dass, um Ihre eigenen Scrolling zu behandeln, müssen Sie die Windows-API aufrufen; Es gibt keine Unterstützung in der .NET-BCL zum Manipulieren des Konsolenbildschirmpuffers. Ich habe Code, den Sie verwenden können, um es zu tun (siehe http://mischel.com/toolutil/consoledotnet.zip), aber es ist irgendwie beteiligt. Außerdem haben Sie zusätzliche Probleme, wenn die Zeile, die Sie schreiben, breiter ist als die aktuelle Fensterbreite. Wenn die Zeile umbrochen wird, überschreibt sie Ihre Fortschrittsanzeige.

Es ist wirklich einfacher, die Statusleiste nach jeder Zeile neu zu zeichnen, oder vielleicht eine Gruppe von Zeilen, wenn Sie mehrere Zeilen gleichzeitig schreiben.

+0

Danke, jim. Ich habe es mit dem einfacheren Weg gemacht. :) Zumindest ist der Effekt in Ordnung. – user3461613

+0

@ user3461613: Wenn dies Ihre Frage beantwortet hat, markieren Sie sie bitte als akzeptierte Antwort. –