在Windows中获取空闲进程的总CPU时间,类似于任务管理器

时间:2012-07-30 15:47:03

标签: c# windows

我正在开发一个大型应用程序,并希望了解CPU在两个时间点之间的加载方式。我不只是对自己的过程感兴趣,而是对所有过程感兴趣。

我的想法是在两个时间段之间获得空闲进程的总CPU时间。然后将该值与实际时差进行比较。然后可以计算在空闲进程上花费的平均CPU时间百分比,从而计算在实际进程上花费的平均CPU百分比。

例如:

  • 实时样本:2012/07/30 13:56:1和2012/07/30 13:56:21
  • 空闲进程总CPU时间样本:56:23:10和56:23:15
  • 实时差异:20秒
  • 空闲进程总CPU时间的差异:5s
  • 空闲进程中的平均CPU时间百分比:25%
  • 实际流程中的平均CPU时间百分比:75%

为了尽可能减少性能影响,我只想拍两个样本。一个在开始,一个在结束。

我也不想查看其他进程以计算总CPU负载,只计算空闲进程。 (例如,我不想计算其他进程的总CPU时间总和)

我曾尝试使用Kernel32.dll OpenProcess。但显然你无法访问空闲进程。它会抛出ERROR_ACCESS_DENIED异常。

这必须是可行的,因为任务管理器显示空闲进程的总CPU时间。

注意:我对进程的瞬时%CPU时间不感兴趣。仅计算总CPU时间以便稍后计算平均值。

2 个答案:

答案 0 :(得分:3)

你可能正在寻找这样的东西:

static Program
{
    private static PerformanceCounter cpuCounter = new PerformanceCounter() { 
        CategoryName = "Processor", 
        CounterName = "% Processor Time", 
        InstanceName = "_Total" };

    static void Main()
    {
        cpuCounter.NextValue();
        // Do your processing here.
        float totalCpuUsagePercentage = cpuCounter.NextValue();
    }
}

totalCpuUsagePercentage将包含自上次cpuCounter.NextValue()以来的总负载百分比。

如果您不想要百分比,则可以使用CounterName =“Processor Time”。

希望这能帮助你完成任务。

答案 1 :(得分:0)

“空闲过程”很可能不存在。

您可以尝试暂停您自己的“空闲进程”,其中包含[no。核心]线程,空闲+ 1优先级,CPU循环,计算经过的时间。这可能有用。

它还可以为您的制冷系统提供一些锻炼和温暖办公室:)