用VC获取Windows系统CPU占有率

 前段时间,在做一套系统,系统的数据采集部分对系统cpu占有率有要求,在cpu占有率到达100%时,USB传输数据就会出现问题,因此最好能够实时监视CPU的占有率,占有高的时候暂停采集,等到恢复到低占有率时恢复采集,这样系统就比较问题。本来想自己写一个这样的功能,在百度上一搜,结果有前辈分享了(搜索是个好东东啊,提高工作效率哦)。我现在在这里再转载一下(前辈不要见怪,我是换了好多关键字才搜到你的哦),以便有同样需要的朋友,能方便搜到,呵呵。

#include <windows.h>
#include <conio.h>
#include <stdio.h>
#define SystemBasicInformation       0
#define SystemPerformanceInformation 2
#define SystemTimeInformation        3
#define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart))

typedef struct{   
 DWORD   dwUnknown1;   
 ULONG   uKeMaximumIncrement;   
 ULONG   uPageSize;   
 ULONG   uMmNumberOfPhysicalPages;   
 ULONG   uMmLowestPhysicalPage;   
 ULONG   uMmHighestPhysicalPage;   
 ULONG   uAllocationGranularity;   
 PVOID   pLowestUserAddress;   
 PVOID   pMmHighestUserAddress;   
 ULONG   uKeActiveProcessors;   
 BYTE    bKeNumberProcessors;   
 BYTE    bUnknown2;   
 WORD    wUnknown3;
} SYSTEM_BASIC_INFORMATION;

typedef struct{   
 LARGE_INTEGER   liIdleTime;   
 DWORD           dwSpare[76];
} SYSTEM_PERFORMANCE_INFORMATION;

typedef struct{   
 LARGE_INTEGER liKeBootTime;   
 LARGE_INTEGER liKeSystemTime;   
 LARGE_INTEGER liExpTimeZoneBias;   
 ULONG         uCurrentTimeZoneId;   
 DWORD         dwReserved;
} SYSTEM_TIME_INFORMATION;

typedef LONG (WINAPI *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);
PROCNTQSI NtQuerySystemInformation;

void main()
{   
 SYSTEM_PERFORMANCE_INFORMATION SysPerfInfo;   
 SYSTEM_TIME_INFORMATION        SysTimeInfo;   
 SYSTEM_BASIC_INFORMATION       SysBaseInfo;   
 double                         dbIdleTime;   
 double                         dbSystemTime;   
 LONG                           status;   
 LARGE_INTEGER                  liOldIdleTime = {0,0};   
 LARGE_INTEGER                  liOldSystemTime = {0,0};   
 NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(GetModuleHandle("ntdll"),"NtQuerySystemInformation");   
 if (!NtQuerySystemInformation)      return;   
 // get number of processors in the system   
 status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);   
 if (status != NO_ERROR)      
  return;   
 int amount=0;
 //printf("/n您的CPU使用率为:    ");   
 while(!_kbhit())   
 {       
  //设置新的系统时间: 
  amount++;
  status = NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);       
  if (status!=NO_ERROR)     
   return;       
  status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);       
  if (status != NO_ERROR)   
   return;
  if (liOldIdleTime.QuadPart != 0)
  {           
   dbIdleTime = Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
            dbSystemTime = Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);           
   dbIdleTime = dbIdleTime / dbSystemTime;           
   dbIdleTime = 100.0 - dbIdleTime * 100.0 / (double)SysBaseInfo.bKeNumberProcessors;  
   int c=(int)dbIdleTime;  
   printf("/b/b/b/b/b/b/b/b/b/b/b/b/b%d---%d%%",amount,c);
  }       
  //改变新的CPU使用率和系统时间       
  liOldIdleTime = SysPerfInfo.liIdleTime;       
  liOldSystemTime = SysTimeInfo.liKeSystemTime;
  Sleep(1000);   
 }
 printf("/n");
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows中,获取CPU使用率可以使用PerformanceCounter类和ManagementObject类来实现。 首先,可以使用PerformanceCounter类从计算机性能计数器中获取CPU使用率。通过实例化PerformanceCounter类并指定相关的性能计数器类别和计数器名称,可以获取CPU使用率。代码示例如下: ```csharp PerformanceCounter cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total"); float cpuUsage = cpuCounter.NextValue() / Environment.ProcessorCount; System.Threading.Thread.Sleep(1000); // 等待1秒 cpuUsage = cpuCounter.NextValue() / Environment.ProcessorCount; Console.WriteLine("CPU使用率: " + cpuUsage.ToString("0.00") + "%"); ``` 以上代码实例化了PerformanceCounter类,并指定了Processor类别的"% Processor Time"计数器。通过调用NextValue()方法获取计数器的下一个值,然后除以ProcessorCount得到CPU使用率。为了获取到实时的CPU使用率,sleep方法会等待1秒钟再次获取值。最后将获取到的值输出。 另外一种方式是使用ManagementObject类从Windows Management Instrumentation (WMI) 中获取CPU使用率。通过使用WQL (Windows Management Query Language) 查询语句来获取相关信息,代码示例如下: ```csharp ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from Win32_PerfFormattedData_PerfOS_Processor"); ManagementObjectCollection collection = searcher.Get(); foreach (ManagementObject obj in collection) { if (obj["Name"].ToString() == "_Total") { float cpuUsage = 100 - float.Parse(obj["PercentIdleTime"].ToString()); Console.WriteLine("CPU使用率: " + cpuUsage.ToString("0.00") + "%"); break; } } ``` 以上代码使用ManagementObjectSearcher类指定WQL查询语句,通过Get()方法获取到相关的性能数据。然后遍历获取到的集合,找到Name为"_Total"的对象,通过PercentIdleTime属性计算CPU使用率。 无论是使用PerformanceCounter类还是ManagementObject类,都能够获取Windows中的CPU使用率。具体使用哪种方式可以根据需要来选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值