WEB开发网
开发学院软件开发C++ 如何获得CPU使用率 阅读

如何获得CPU使用率

 2008-03-08 12:46:08 来源:WEB开发网   
核心提示:NT/2000方法:#include <windows.h>#include <conio.h>#include <stdio.h>#define SystemBasicInformation 0#define SystemPerformanceInformation 2#defin

  NT/2000方法:

#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
   &nb

Tags:如何 获得 CPU

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接