Hope is a Dream. Dream is a Hope.

非公開ブログは再開しました。

C#でWindowsのCPU使用率を取得する方法

CPUの使用率をアプリに表示したいよね。 でも、マルチコアとかだと意外と面倒。 以下に、クラス化したので使ってください。

内部タイマーを使って、バッファをためます。 それを取得して使うだけ。

List<SingleCPUManager> SingleCPUList = new List<SingleCPUManager>();

// Initialize
for (int i = 0; i<SingleCPUManager.GetCPUCount(); i++)
{
    SingleCPUList.Add(new SingleCPUManager(i, 200, 4, 30));
}

// Load Data
int Ncpu = Environment.ProcessorCount;
for (int k = 0; k<Ncpu; k++)
{
    SingleCPUManager scpu = SingleCPUList[k];
    float[] cpu_values = scpu.GetQueBuffer().ToArray();
}

using System;
using System.Collections.Generic;
using System.Diagnostics;

namespace SimScreenSaver
{

    /// <summary>
    /// CPUマネージャー
    /// </summary>
    public class SingleCPUManager
    {



        PerformanceCounter Counter;
        int BufferLength;

        public int CPUIndex;

        int Tap;

        List<float> QueBuffer;
        private System.Windows.Forms.Timer timer;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="index">CPU番号</param>
        /// <param name="buffer_length">バッファ長さ</param>
        /// <param name="tap">移動平均tap</param>
        public SingleCPUManager(int index, int buffer_length, int tap, int interval_ms)
        {

            // Param
            this.BufferLength = buffer_length;
            this.CPUIndex = index;
            this.Tap = tap;
            if (this.Tap <= 0) this.Tap = 1;

            // Init
            Init();

            // タイマーの間隔(ミリ秒)
            timer = new System.Windows.Forms.Timer();
            timer.Interval = interval_ms;
            timer.Tick += Timer_Tick;
            timer.Start();
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            Update();
        }

        /// <summary>
        /// 初期化
        /// </summary>
        /// <param name="index"></param>
        /// <param name="buffer_length"></param>
        void Init()
        {
            // CPUカウンタ
            Counter = new PerformanceCounter("Processor", "% Processor Time", CPUIndex.ToString());

            // バッファ
            QueBuffer = new List<float>();

            // バッファの初期化
            for (int i = 0; i < BufferLength; i++)
            {
                QueBuffer.Add(0.0f);
            }
        }

        /// <summary>
        /// アップデート
        /// バッファにデータを追加
        /// </summary>
        void Update()
        {
            float v = Counter.NextValue();

            // 移動平均

            float ave = 0;
            for (int i = 0; i < Tap - 1; i++)
            {
                ave += QueBuffer[(QueBuffer.Count - 1) - i];
            }
            ave += v;
            ave /= Tap;
            v = ave;

            QueBuffer.Add(v);
            QueBuffer.RemoveAt(0);
        }


        /// <summary>
        /// バッファを渡す
        /// </summary>
        /// <returns></returns>
        public List<float> GetQueBuffer()
        {
            return QueBuffer;
        }

        /// <summary>
        /// Utilities
        /// </summary>
        /// <returns></returns>
        static public int GetCPUCount()
        {
            return Environment.ProcessorCount;
        }

    }
}