龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

如何获得CPU使用率

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
NT/2000方法: #include #include #include #define SystemBasicInformation 0 #define SystemPerformanceInformation 2 #define SystemTimeInformation 3 #define Li2Double(x) ((double)((x).HighPart) * 4.294967296E9 + (double)((x).LowPart)) typede

  NT/2000方法:

  

  

#include

  

#include

  

#include

  

  

#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("

CPU 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

  

精彩图集

赞助商链接