2016-04-26 3 views
-2

Что я делаю, это чтение записей журнала в консоли. Я хочу сохранить прогресс в нижней части и показать прогресс.C# Консоль всегда держит индикатор выполнения внизу

Проблема заключается в том, что запись обновления будет перекрывать панель прогресса.

 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

Добро пожаловать в переполнение стека, пожалуйста, прочитайте [как спросить] (http://stackoverflow.com/help/How-to-ask), так как здесь нет никаких вопросов. – BugFinder

ответ

0

Вам необходимо установить курсор в правильное положение.

Вот простой пример SetCursorPosition:

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

Перед печати прогрессбара вам нужно выяснить, где начать и сбросить курсор перед записью ProgressBar.

+0

Thx для вашего ответа. :) – user3461613

0

Существует простой способ сделать это и несколько очень трудных способов сделать это.

Простым способом является повторное отображение индикатора выполнения после каждого звонка до Console.WriteLine. Таким образом, не имеет значения, перезаписывает ли строка прокрутки индикатор выполнения, потому что вы просто собираетесь его повторно отобразить.

Если вы хотите получить фантазию, вам необходимо обработать прокрутку. Это означает создание потомка TextWriter, который видит, что вы пишете до последней строки (где находится строка состояния), и поэтому, когда какой-либо код хочет записать в нижнюю строку, где находится индикатор выполнения, вы прокручиваете остальную часть экрана и напишите новую строку в освобожденном месте.

Существует несколько проблем со вторым подходом, первый из которых заключается в том, что для обработки вашей собственной прокрутки вам необходимо вызвать Windows API; в .NET BCL нет поддержки для управления буфером экрана консоли. У меня есть код, который вы можете использовать, чтобы сделать это (см. http://mischel.com/toolutil/consoledotnet.zip), но это отчасти связано. Кроме того, у вас есть дополнительные проблемы, если строка, которую вы пишете, шире текущей ширины окна. Если строка обертывается, то она перезапишет ваш индикатор выполнения.

Действительно проще просто перерисовать строку состояния после каждой строки или, возможно, группу строк, если вы пишете несколько строк за раз.

+0

Thx, jim. Я сделал это с помощью более простого способа. :) По крайней мере, эффект в порядке. – user3461613

+0

@ user3461613: Если это ответили на ваш вопрос, отметьте его как принятый ответ. –

Смежные вопросы