2016-04-26 6 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

カーソルを正しい位置に設定する必要があります。あなたはプログレスバーを書き込む前に開始し、カーソルをリセットするために場所を見つける必要があるプログレスバーを印刷する前に

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

:ここ

はSetCursorPositionの簡単な例です。

+0

Thxです。 :) – user3461613

0

これを行う簡単な方法とこれを行うためのいくつかの非常に難しい方法があります。

簡単な方法は、Console.WriteLineを呼び出すたびにプログレスバーを再表示することです。そうすれば、スクロールされた行がプログレスバーを上書きするかどうかは重要ではありません。なぜなら、それを再表示するだけだからです。

あなたが気に入らなければならない場合は、自分でスクロールする必要があります。つまり、末尾の行(ステータス行がある)に書き込むと見なされる子孫のTextWriterを作成することを意味します。そのため、進行状況バーがどこにある行の下端に書き込む場合は、残りの画面をスクロールし、空白の場所に新しい行を書き出します。

2つ目のアプローチにはいくつかの問題があります。まず、独自のスクロールを処理するためにWindows APIを呼び出す必要があります。コンソール画面バッファを操作するための.NET BCLのサポートはありません。私はあなたがそれを行うために使用できるコードを持っています(http://mischel.com/toolutil/consoledotnet.zipを参照)が、それは関係しています。さらに、書いている行が現在のウィンドウの幅より広い場合には、さらに問題があります。行が折り返されると、進行状況バーが上書きされます。

すべての行の後にステータスバーを再描画するのは簡単です。一度に複数の行を書き込む場合は、行のグループを作成するのが簡単です。

+0

Thx、jim。私はもっ​​と簡単な方法でそれをやった。 :)少なくとも効果は大丈夫です。 – user3461613

+0

@ user3461613:これがあなたの質問に答えた場合、それを受け入れられた回答としてマークしてください。 –

関連する問題