アプリケーションバー


私は、誰もが1ポイントまたは別のコンソールアプリケーションでプログレスバーを見ていることを確認します.今週、私は自分の進捗バーシステムを構築することに決めました.
ここでは、プログレスバーのクラスを見てきました.デザインは非常に簡単です.
class ProgressBar
{
    private readonly int length;

    public ProgressBar(int length)
    {
        this.length = length;
    }

    public string GetUpdate(int progress)
    {
        progress /= 100 / this.length;

        string progressString = string.Empty;
        for (int i = 0; i < progress; i++)
        {
            progressString = $"{progressString}-";
        }

        string remainderString = string.Empty;
        for (int i = 0; i < this.length - progress; i++)
        {
            remainderString = $"{remainderString} ";
        }

        return $"{progressString}{remainderString}";
    }
}
プログレスバーの長さ(文字)を制御する長さのフィールドがあります.にGetUpdate 方法、私は相対的な進行状況(割合)の長さを得るためにいくつかの簡単な数学をやっている.その後、単に進行状況の長さを反復処理し、進捗文字列にダッシュを追加します.最後に、プログレスバーの長さを経過した長さを反復して、2つの補間を返す前に空白文字を残りの文字列に追加します.
このクラスを使用して、選択したものの進捗を表現することができますが、システムのプロセッサ時間を追跡するアプリケーションを作りたいと思いました.以下は私の実装です.
class Program
{
    static List<int> percentages;

    static ProgressBar processorTimeBar;

    static System.Diagnostics.PerformanceCounter processorCounter;

    static System.Timers.Timer timer;
    static System.Timers.Timer processorTimer;

    static void Main(string[] args)
    {
        Console.CursorVisible = false;

        processorCounter = new System.Diagnostics.PerformanceCounter("Processor", "% Processor Time", "_Total");

        processorTimeBar = new ProgressBar(50);

        percentages = new List<int>();

        timer = new System.Timers.Timer();
        timer.Interval = 200;

        processorTimer = new System.Timers.Timer();
        processorTimer.Interval = 50;

        timer.Elapsed += Update;
        timer.Enabled = true;

        processorTimer.Elapsed += UpdatePercentages;
        processorTimer.Enabled = true;

        Console.ReadLine();
    }

    static void Update(object sender, System.Timers.ElapsedEventArgs e)
    {
        Console.Write("Processor Time: [");
        Console.ForegroundColor = ConsoleColor.Green;
        Console.Write(processorTimeBar.GetUpdate((int)percentages.Average()));
        Console.ResetColor();
        Console.Write(']');
        Console.ForegroundColor = ConsoleColor.Green;
        Console.WriteLine($" {(int)percentages.Average():000}%");
        Console.ResetColor();
        Console.WriteLine("Press any key to exit . . . ");
        Console.SetCursorPosition(Console.CursorLeft, Console.CursorTop - 2);
        percentages = new List<int>();
    }

    static void UpdatePercentages(object sender, System.Timers.ElapsedEventArgs e)
    {
        percentages.Add((int)processorCounter.NextValue());
    }
}
コードバーには、プログレスバークラスやプログレスバークラス自体のいずれかで、抽象化されるべきコードがいくつかあります.
最初に、あなたはラインに気づくでしょう.Console.CursorVisible = false; . これは全くのブレインではないかもしれませんが、この行はカーソルがアプリケーションに描画されるのを防ぎます.プログラムがカーソルの位置を速く変更するので、これは私たちがストロークをするのを防ぎます.しかし、ターミナルのどこかをクリックすると、簡単に編集モードが可能になり、カーソルの可視性だけでなく、柵から外れた位置になります.この問題に解決策を実装する場合は、見てみることができますthis アプリケーションの実行中にクイック編集機能を無効にする方法.
次に、2つのタイマの経過イベントをそれぞれ登録する2つの関数が通知されます.これは正確に必要ではありませんが、更新機能が呼ばれるとき、私はプロセッサ時間の平均を必要としませんでした.私は50ミリ秒ごとにプロセッサ時間を格納し、1秒あたり5回と呼ばれる更新機能のリストをリセットするリストを使用します.
最後に、呼び出しがありますConsole.SetCursorPosition 更新方法の中で、前の行を書くことができます.これは、固定プログレスバーの幻想を作成します.
それを書く前に線をクリアせずに、書かれていない文字は目に見えます.この振舞いを防ぐための私の簡単な戦略は、3つのスペースにパーセンテージ出力をフォーマットすることでした.
それは、これに取り組む多くの楽しみでした、そして、それは私が当初それがそうであると思ったより驚くほど非常に単純でした.私は、これが伝統的にそのような特徴を実装する方法に近いと確信していません、それにもかかわらず、私は将来他の戦略を探して楽しみます.