CPU
有时候要知道CPU的占有率,NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(GetModuleHandle(TEXT("ntdll")), "NtQuerySystemInformation");这个方式在WIN7有问题,现在使用GetSystemTimes来获取CPU的占有率。
原理:CPU利用率定义为;用户进程时间 / (用户进程时间 + 内核时间)。
GetSystemTimes的解释:
BOOL WINAPI GetSystemTimes(
__out_opt LPFILETIME lpIdleTime,
__out_opt LPFILETIME lpKernelTime,
__out_opt LPFILETIME lpUserTime
);
To compile an application that uses this function, define _WIN32_WINNT as 0x0501 or later. For more information。本函数返回系统时序信息,在多核处理器环境下,返回值为所有核心的求和。
本函数返回3个时间信息,分别是空闲时间、内核时间、用户进程时间。windows系统处于空闲时会运行SystemIdle进程,该进程运行在内核态,因此空闲时间位于内核时间内。
FILETIME
本数据结构定位如下:
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
FILETIME数据结构为一个64位数据,它表示从1601年1月1日起,距离现在100纳米时间单位的数量。
#define _WIN32_WINNT 0x0501
#include <windows.h>
__int64 CompareFileTime ( FILETIME time1, FILETIME time2 )
{
__int64 a = time1.dwHighDateTime << 32 | time1.dwLowDateTime ;
__int64 b = time2.dwHighDateTime << 32 | time2.dwLowDateTime ;
return (b - a);
}
int _tmain(int argc, _TCHAR* argv[])
{
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 ;
while (1){
Sleep(1000);
res = GetSystemTimes( &idleTime, &kernelTime, &userTime );
int idle = CompareFileTime( preidleTime,idleTime);
int kernel = CompareFileTime( prekernelTime, kernelTime);
int user = CompareFileTime(preuserTime, userTime);
int cpu = (user) *100/(kernel+user);
printf("cpu per %d\n",cpu);
preidleTime = idleTime;
prekernelTime = kernelTime;
preuserTime = userTime ;
}