1,原理
CPU资源看做是一个个的时间片,统计CPU使用率也是计算在一段时间内忙碌的时间占比。
我们知道GetSystemTime可以得到当前系统时间,另外一个名字类似的函数,GetSystemTimes可以得到三种不同的时间(自开机以来):空闲时间,内核时间和用户时间。
函数原型:
BOOL WINAPI GetSystemTimes(
_Out_opt_ LPFILETIME lpIdleTime,
_Out_opt_ LPFILETIME lpKernelTime,
_Out_opt_ LPFILETIME lpUserTime
);
CPU要么是在内核态,要么是在用户态。相加就是CPU总时间。
所以有以下公式:
CPU使用率 = (内核时间 + 用户时间 - 空闲时间)/(内核时间 + 用户时间)。
在较短的间隔时间内,先后两次调用GetSystemTimes,然后相减,再使用上面的公式可得出这段时间内的CPU使用率。
2,使用
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
__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[])
{
HANDLE hEvent;
FILETIME preidleTime;
FILETIME prekernelTime;
FILETIME preuserTime;
GetSystemTimes( &preidleTime, &prekernelTime, &preuserTime );
hEvent = CreateEvent (NULL,FALSE,FALSE,NULL); // 初始值为 nonsignaled ,并且每次触发后自动设置为nonsignaled
while (1){
WaitForSingleObject( hEvent,1000 ); //等待500毫秒
FILETIME idleTime;
FILETIME kernelTime;
FILETIME userTime;
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);
cout << "CPU利用率:" << cpu << "%" <<endl;
preidleTime = idleTime;
prekernelTime = kernelTime;
preuserTime = userTime ;
}
return 0;
}
效果如图: