Posted
Filed under .NET/C#
using System;
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;
using System.Diagnostics;
using System.Windows.Forms.DataVisualization.Charting;
using System.Threading;

namespace CPUUsage
{
    public partial class Form1 : Form
    {
        private Thread addDataRunner;
        public delegate void AddDataDelegate();
        public AddDataDelegate addDataDel;
        public double state;

        PerformanceCounter p;
        public Form1()
        {
            InitializeComponent();
        }

        private void btnShow_Click(object sender, EventArgs e)
        {
            p = new PerformanceCounter();
            p.CategoryName = "Processor";
            p.CounterName = "% Processor Time";
            p.InstanceName = "_Total";
 
            addDataRunner.Start();
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            //Thread
            ThreadStart addDataThreadStart = new ThreadStart(AddDataThreadLoop);
            addDataRunner = new Thread(addDataThreadStart);

            addDataDel += new AddDataDelegate(AddData);


            chart1.ChartAreas[0].AxisX.Minimum = 0;
            chart1.ChartAreas[0].AxisX.Maximum = 60;

            chart1.ChartAreas[0].AxisY.Minimum = 0;
            chart1.ChartAreas[0].AxisY.Maximum = 100;

            chart1.Series.Clear();

            Series newSeries = new Series("CPU Usage");
            newSeries.ChartType = SeriesChartType.Spline;
            newSeries.BorderWidth = 2;
            newSeries.Color = Color.Orange;
            newSeries.XValueType = ChartValueType.Double;
            chart1.Series.Add(newSeries);
        }

        private void AddDataThreadLoop()
        {
            while (true)
            {
                chart1.Invoke(addDataDel);

                Thread.Sleep(1000);
            }
        }

        public void AddData()
        {
            foreach (Series ptSeries in chart1.Series)
            {
                AddNewPoint(ptSeries);
            }
        }
        public void AddNewPoint(Series ptSeries)
        {
            float usage = p.NextValue();

            ptSeries.Points.AddXY(state, usage);
            lbUsage.Text = ((int)usage).ToString()+"%";
            lbPoint.Text = string.Format("{0}{1}", state.ToString()," sec");

            if (state % 60 == 0)
            {
                chart1.ChartAreas[0].AxisX.Minimum = state;
                chart1.ChartAreas[0].AxisX.Maximum = state+60;
            }
            
            state++;
            
            chart1.Invalidate();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            addDataRunner.Abort();
        }

    }
}

C#으로 CPU사용량 측정 프로그램 소스 코드입니다.
chart는 MS chart를 이용하였습니다.(MS chart를 이용하시려면 .net Framework 3.5 sp1, mschart관련 컴포넌트가 필요합니다..)

2009/09/18 17:04 2009/09/18 17:04