C# Winform

C# CPU & MEMORY 사용량을 DATAGRIDVIEW로 보기

agape93 2021. 1. 31. 17:09

CPU & MEMORY 사용량

private void btn_process_Click(object sender, EventArgs e)
{
    //timer 추가 하여 1초마다 update
    timer1.Interval = 1000;
    timer1.Start();
    GetProcess();
}

public void GetProcess()
{
    //Process 정보
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_PerfFormattedData_PerfProc_Process");

    //DataTable 생성
    DataTable table = new DataTable();
    table.Columns.Add("Name", typeof(object));
    table.Columns.Add("CPU(%)", typeof(double));
    table.Columns.Add("Memory(M)", typeof(double));
    table.Columns.Add("ProcessID", typeof(object));
    table.Columns.Add("Handles", typeof(object));
    table.Columns.Add("Threads", typeof(object));

    //CPU 개수
    int cpusn = Environment.ProcessorCount;
    
    try
    {
        foreach (ManagementObject queryObj in searcher.Get())
        {
            //CPU - dataGridView에서 정렬 가능하도록
            var name = queryObj.GetPropertyValue("Name");
            string cputemp = queryObj.GetPropertyValue("PercentProcessorTime").ToString();
            double cpu = double.Parse(cputemp) / cpusn;
            cputemp = string.Format("{0:N2}", cpu);
            cpu = double.Parse(cputemp);
            //memory - dataGridView에서 정렬 가능하도록
            string memorytemp = queryObj.GetPropertyValue("WorkingSetPrivate").ToString();
            double memory = double.Parse(memorytemp) / 1024 / 1024;
            memorytemp = string.Format("{0:N2}", memory);
            memory = double.Parse(memorytemp);
            
            var process = queryObj.GetPropertyValue("IDProcess");
            var handle = queryObj.GetPropertyValue("HandleCount");
            var thread = queryObj.GetPropertyValue("ThreadCount");

            table.Rows.Add(name, cpu, memory, process, handle, thread);
        }
    }
    catch (Exception ex)
    {
        //MessageBox.Show(ex.ToString());
    }

    //cpu 기준으로 정렬
    table.DefaultView.Sort = "CPU(%) DESC";
    //dataGridView에 입력
    dataGridView1.DataSource = table;

    try
    {
        //txt 저장
        StreamWriter SW;
        SW = File.CreateText(@"d:\temp\test.txt");
        foreach (ManagementObject queryObj in searcher.Get())
        {
            SW.Write("Name: {0} ", queryObj["Name"]);
            SW.Write("ProcessID: {0} ", queryObj["IDProcess"]);
            SW.Write("Handles: {0} ", queryObj["HandleCount"]);
            SW.Write("Threads: {0} ", queryObj["ThreadCount"]);
            SW.Write("Memory: {0} ", queryObj["WorkingSetPrivate"]);
            SW.WriteLine("CPU%: {0}", queryObj["PercentProcessorTime"]);
        }
        SW.Close();
    }
    catch (Exception ex)
    {
        //MessageBox.Show(ex.ToString());
    }
    
}

//timer 이용하여 강제 버튼 크릭 (1초마다 update)
private void timer1_Tick(object sender, EventArgs e)
{
  	btn_process.PerformClick();
}

참고 : https://duongame.tistory.com/356