2014年3月29日土曜日

実験:CPU使用率の取得

CPU使用率取得のため、以下のコードを作成しました。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace cpu_ctrl
{
    public partial class MainForm : Form
    {
        private bool isLoop_cpuCtrl = true;         // CPU のコントロールループを継続するかどうか


        private int timeSpan_cpuCtrl = 100;         // CPU のコントロールループの実施間隔

        public MainForm()
        {
            InitializeComponent();
        }

        delegate void Del_setCPUUsage(float cpuUsage);

        private void backgroundWorker_CPUCtrl_DoWork(object sender, DoWorkEventArgs e)
        {
            // CPU 使用率のチェック用
            System.Diagnostics.PerformanceCounter pc_cpu = 
                new System.Diagnostics.PerformanceCounter("Processor", "% Processor Time", "_Total");

            // CPU 使用率を設定するためのデリゲート
            Del_setCPUUsage del_setCPUUsage = cpuUsage => { label_cpu.Text = cpuUsage.ToString("0.0") + " %"; };


            while (isLoop_cpuCtrl)
            {
                float cpuUsage = pc_cpu.NextValue();
                label_cpu.Invoke(del_setCPUUsage, new object[] { cpuUsage });


                System.Threading.Thread.Sleep(timeSpan_cpuCtrl);
            }
        }

        private void ToolStripMenuItem_Exit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            // CPU コントロールスレッドを起動
            backgroundWorker_CPUCtrl.RunWorkerAsync();
        }

        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            // CPU コントロールループを終了する
            isLoop_cpuCtrl = false;
        }
    }
}


また、CPU使用率計測のため、起動すると1スレッドが無限ループを実施し、CPUリソースを消費する以下のプログラムも作成しました。(process-dummy)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace process_dummy
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        private bool isLoop = true;

        private void backgroundWorker_dummy_DoWork(object sender, DoWorkEventArgs e)
        {
            while (isLoop) ;
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            backgroundWorker_dummy.RunWorkerAsync();
        }

        private void MainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            isLoop = false;
        }
    }
}


この実験結果を以下の動画にまとめました。

実験:CPU使用率の取得

(細かい文字を見るには、解像度を480p以上に設定してください。)


実験に使用したPCは論理プロセッサが8個あります。
process-dummyを1個起動するごとに、PCのCPU使用率の 1/8 を消費します。

process-dummy を 8個起動することで、PCのCPU使用率が 100% になりました。


実験は成功です。


関連記事
同じラベルをすべて含む記事を読み込み中...