ykw377288218 2016-10-22 03:48 采纳率: 0%
浏览 2958

C#计算指定进程占用CPU的使用率(窗口用Timer刷新1s1次)求指点,算的跟实际任务管理器差距极大

   private void getCPUDeatil(Process cur)
    {
        //listView1.Items.Clear();
        var item1 = new ListViewItem();
        //item1.ImageIndex = 1;
        //获取当前进程对象
        //Process cur = Process.GetCurrentProcess();
        //行中添加进程名 
        item1.Text = cur.ProcessName;
        //Console.WriteLine(curtime.NextValue());
        PerformanceCounter curpcp = new PerformanceCounter("Process", "Working Set - Private", cur.ProcessName);
        PerformanceCounter curpc = new PerformanceCounter("Process", "Working Set", cur.ProcessName);
        PerformanceCounter curtime = new PerformanceCounter("Process", "% Processor Time", cur.ProcessName);
        PerformanceCounter ramCounter = new PerformanceCounter("Memory", "Available MBytes");
        //上次记录CPU的时间
        TimeSpan prevCpuTime = TimeSpan.Zero;
        curtime.NextValue();
        //Sleep的时间间隔
        double interval = timer1.Interval;

        PerformanceCounter totalcpu = new PerformanceCounter("Processor", "% Processor Time", "_Total");

        //当前时间
        TimeSpan curCpuTime = cur.TotalProcessorTime;
        //计算
        double value = (curCpuTime - prevCpuTime).TotalMilliseconds /interval/ Environment.ProcessorCount * 10;
        prevCpuTime = curCpuTime;
        //将值加入窗口
        item1.SubItems.Add(Math.Round(curpcp.NextValue() / 1024/1024, 2) + "MB");
        item1.SubItems.Add(Math.Round(curtime.NextValue()/Environment.ProcessorCount, 2) + "%");
        //item1.SubItems.Add(Math.Round(value, 2) + "%");
        item1.SubItems.Add(Convert.ToString(cur.Id));
        listView1.Items.Add(item1);

    }
private void timer2_Tick(object sender, EventArgs e)
        {
            listView1.Items.Clear();

            Process pro1;
            pro1 = Process.GetCurrentProcess();
            getCPUDeatil(pro1);
            Process[] pro2 = Process.GetProcessesByName("CefSharp.BrowserSubprocess");
            //curtime.InstanceName = "CefSharp.BrowserSubprocess";
            for (int i = 0; i < pro2.Length; i++)
            {
                //curtime = new PerformanceCounter("Process", "% Processor Time",pro2[i].ProcessName);
                //Console.WriteLine(curtime.InstanceName);
                getCPUDeatil(pro2[i]);
            }
        }

这是我写的代码,不太规范,也是到处复制的,计算的跟实际的任务管理器的相差太大,上面要求用timer刷新,timer每次刷新,里面的代码都要重新加载一次可能导致计算差距大。求大神指点啊,急急急!!!

  • 写回答

2条回答 默认 最新

  • threenewbee 2016-10-22 08:18
    关注

    % Processor Time算的是相对一个cpu的占比,如果你是多核心cpu,这个值需要除以计算机上的逻辑cpu的个数。(你在任务管理器看到几个框就除以几)

    评论

报告相同问题?

悬赏问题

  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B