歌舞程序

导航

获取CPU使用率信息

第一种: 

#define _WIN32_WINNT 0x0501    //使用GetSystemTimes需要定义该变量值大于等于0x0501,详看MSDN

 

__int64 CompareFileTime ( FILETIME time1, FILETIME time2 )

{
__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime ;
__int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime ;
return (b - a);
}

 

//获取CPU利用率
int GetCpuUsage()
{
BOOL res ;
FILETIME preidleTime;
FILETIME prekernelTime;
FILETIME preuserTime;
FILETIME idleTime;
FILETIME kernelTime;
FILETIME userTime;
res = GetSystemTimes(&idleTime, &kernelTime, &userTime);
preidleTime = idleTime;
prekernelTime = kernelTime;
preuserTime = userTime ;
::Sleep(1000);
res = GetSystemTimes( &idleTime, &kernelTime, &userTime );
int idle = CompareFileTime( preidleTime,idleTime);
int kernel = CompareFileTime( prekernelTime, kernelTime);
int user = CompareFileTime(preuserTime, userTime);
int cpu = (kernel +user - idle) *100/(kernel+user);
int cpuidle = ( idle) *100/(kernel+user);
preidleTime = idleTime;
prekernelTime = kernelTime;
preuserTime = userTime ;
return cpu;

 

第二种:使用NtQuerySystemInformation 

#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; 

 

///////////get cpu usage//////////////////
////2k,xp//////据资料说NtQuerySystemInformation 函数在win7下不好使,没验证
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 -1;
// get number of processors in the system
status = NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);
if (status != NO_ERROR)
return -1;
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 -1;
// get new CPU's idle time
status = NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);
if (status != NO_ERROR)
return -1;
// 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");
     
    ////////2k,xp//////////
///9x  can not used in xp ////
     HKEY hkey;
DWORD dwDataSize;
DWORD dwType;
DWORD dwCpuUsage;
// starting the counter
if ( RegOpenKeyEx( HKEY_DYN_DATA,
             "PerfStats\\StartStat",
             0,KEY_ALL_ACCESS,
             &hkey ) != ERROR_SUCCESS)
{
printf("openkeyex start stat");
return -1;
}
dwDataSize=sizeof(DWORD);
RegQueryValueEx( hkey,
"KERNEL\\CPUUsage",
NULL,&dwType,
(LPBYTE)&dwCpuUsage,
&dwDataSize );
RegCloseKey(hkey);
// geting current counter's value
if ( RegOpenKeyEx( HKEY_DYN_DATA,
"PerfStats\\StatData",
0,KEY_READ,
&hkey ) != ERROR_SUCCESS)
{
printf("openkeyex statdata");
return -1;
}
printf("\nCPU Usage (press any key to exit):  ");
while(!_kbhit())
{
dwDataSize=sizeof(DWORD);
RegQueryValueEx( hkey,
"KERNEL\\CPUUsage",
NULL,&dwType,
(LPBYTE)&dwCpuUsage,
&dwDataSize );
Sleep(500);
printf("\b\b\b\b%3d%%",dwCpuUsage);
}
printf("\n");
RegCloseKey(hkey);
// stoping the counter
if( RegOpenKeyEx( HKEY_DYN_DATA,
"PerfStats\\StopStat",
0,KEY_ALL_ACCESS,
&hkey ) != ERROR_SUCCESS)
{
printf("open stopstat");
return -1;
}
dwDataSize=sizeof(DWORD);
RegQueryValueEx( hkey,
"KERNEL\\CPUUsage",
NULL,&dwType,
(LPBYTE)&dwCpuUsage,
&dwDataSize );
RegCloseKey(hkey);
 

///9x....//// 

 

posted on 2012-07-12 18:26  歌舞程序  阅读(706)  评论(0编辑  收藏  举报