获取cpu占用率

来源:互联网 发布:vera vb bradley 编辑:程序博客网 时间:2024/05/21 16:54

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");   
  }

原创粉丝点击