none
怎样获得CPU的使用率 RRS feed

  • 问题

  • 在网络应用技术中要知道CPU的使用率,没有直接的API函数解决这个问题,请问怎样获得CPU的使用率?
    xiao
    2011年2月15日 8:03

答案

  • //  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 "); 
    }
    • 已标记为答案 wh_xiao 2011年2月15日 13:01
    2011年2月15日 9:43
    版主

全部回复

  • //  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 "); 
    }
    • 已标记为答案 wh_xiao 2011年2月15日 13:01
    2011年2月15日 9:43
    版主
  • 谢谢

    你给了一个很好的思路


    xiao
    2011年2月15日 13:01