获取cpu占用率

from http://topic.csdn.net/t/20060330/19/4652332.html

 

//   cpusagent.cpp   (Windows   NT/2000)   
  //   
  //   Getting   the   CPU   usage   in   percent   on   Windows   NT/2000   
  //   
  //   (c)2000   Ashot   Oganesyan   K,   SmartLine,   Inc   
  //   mailto:ashot@aha.ru,   http://www.protect-me.com,   http://www.codepile.com   
    
  #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;   
    
    
  //   ntdll!NtQuerySystemInformation   (NT   specific!)   
  //   
  //   The   function   copies   the   system   information   of   the   
  //   specified   type   into   a   buffer   
  //   
  //   NTSYSAPI   
  //   NTSTATUS   
  //   NTAPI   
  //   NtQuerySystemInformation(   
  //   IN   UINT   SystemInformationClass,   //   information   type   
  //   OUT   PVOID   SystemInformation,   //   pointer   to   buffer   
  //   IN   ULONG   SystemInformationLength,   //   buffer   size   in   bytes   
  //   OUT   PULONG   ReturnLength   OPTIONAL   //   pointer   to   a   32-bit   
  //   //   variable   that   receives   
  //   //   the   number   of   bytes   
  //   //   written   to   the   buffer     
  //   );   
  typedef   LONG   (WINAPI   *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);   
    
  PROCNTQSI   NtQuerySystemInformation;   
    
    
  void   main(void)   
  {   
  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;   
    
  printf("/nCPU   Usage   (press   any   key   to   exit):   ");   
  while(!_kbhit())   
  {   
  //   get   new   system   time   
  status   =   NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);  
  if   (status!=NO_ERROR)   
  return;   
    
  //   get   new   CPU's   idle   time   
  status   =NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);   
  if   (status   !=   NO_ERROR)   
  return;   
    
  //   if   it's   a   first   call   -   skip   it   
  if   (liOldIdleTime.QuadPart   !=   0)   
  {   
  //   CurrentValue   =   NewValue   -   OldValue   
  dbIdleTime   =   Li2Double(SysPerfInfo.liIdleTime)   -   Li2Double(liOldIdleTime);   
  dbSystemTime   =   Li2Double(SysTimeInfo.liKeSystemTime)   -     
    
  Li2Double(liOldSystemTime);   
    
  //   CurrentCpuIdle   =   IdleTime   /   SystemTime   
  dbIdleTime   =   dbIdleTime   /   dbSystemTime;   
    
  //   CurrentCpuUsage%   =   100   -   (CurrentCpuIdle   *   100)   /   NumberOfProcessors   
  dbIdleTime   =   100.0   -   dbIdleTime   *   100.0   /     
    
  (double)SysBaseInfo.bKeNumberProcessors   +   0.5;   
    
  printf("/b/b/b/b%3d%%",(UINT)dbIdleTime);   
  }   
    
  //   store   new   CPU's   idle   and   system   time   
  liOldIdleTime   =   SysPerfInfo.liIdleTime;   
  liOldSystemTime   =   SysTimeInfo.liKeSystemTime;   
    
  //   wait   one   second   
  Sleep(1000);   
  }   
  printf("/n");   
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值