您的位置:首页 > 其它

WinCE 下 CPU 使用率的计算方法

2016-02-21 16:13 393 查看
在函数 GetIdleTime 的用法中,MSDN 推荐的 CPU 使用率的计算方法,在部分平台下使用时得到的使用率异常:非 0-100% 的数值。

先看看 MSDN 推荐的算法的大概实现:

static void CallCountCpuIdleThread(CCountCpuDlg *pCCountCpuDlg)
{
DWORD dwStartTick;
DWORD dwIdleStart;
DWORD dwStopTick;
DWORD dwIdleEnd;
int   nPresentIdle;
int   nCpuUage[10]={0};
int   nCount=0;
int   ave=0;
DWORD sum=0;
int i;

while(1)
{
dwStartTick=GetTickCount();    // 此处为关键代码 Leo.Zheng
dwIdleStart=GetIdleTime();
Sleep(100);
dwStopTick=GetTickCount();
dwIdleEnd=GetIdleTime();

nPresentIdle=(100*(dwIdleEnd-dwIdleStart))/((dwStopTick-dwStartTick));
// 算法多次的一个平均值 Leo.Zheng
if(nCount<10)
{
nCpuUage[nCount]=nPresentIdle;
nCount++;
if(nCount==10)
{
for(i=0;i<10;i++)
sum+=nCpuUage[i];
ave=sum/10;
// g_nCpuIdle only read in the main thread
g_nCpuIdle=ave;
nCount=0;
sum=0;
//RETAILMSG(1,(TEXT("CPU laoding is %d /r/n"),ave));
}
}
}
}


不使用 GetIdleTime 的计算 CPU 使用率的方法及调用示例如下:

/*
// 调用示例
DWORD dwThreadID = 0;
HANDLE hThread = NULL;
hThread = CreateThread(NULL,0,ThreadPrintCpuLoad,this,0,&dwThreadID);
if(NULL != hThread)
{
CloseHandle(hThread);
}
*/
static DWORD GetThreadTick(FILETIME *pFtKernel, FILETIME *pFtUser)
{
__int64 iKernel64 = 0;
__int64 iUser64 = 0;

iKernel64 = pFtKernel->dwHighDateTime;
iKernel64 <<= 32;
iKernel64 += pFtKernel->dwLowDateTime;

iUser64 = pFtUser->dwHighDateTime;
iUser64 <<= 32;
iKernel64 += pFtUser->dwLowDateTime;

iKernel64 += iUser64;

// nano sec to milli sec
iKernel64 /= 10000;

return (DWORD)iKernel64;
}

static void IdleThread(LPVOID pvParams)
{
while(1)
{
}
}

static DWORD ThreadPrintCpuLoad(LPVOID lpParameter)
{
DWORD dwThreadID = 0;
HANDLE hIdleThread = NULL;

SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);  // 设置高的优先级,保证 CPU 忙的时候也能打印 Leo

hIdleThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)IdleThread,NULL,CREATE_SUSPENDED,&dwThreadID);    // 创建低优先级空闲线程 Leo.Zheng
SetThreadPriority(hIdleThread,THREAD_PRIORITY_IDLE);
ResumeThread(hIdleThread);

while(1)
{
Sleep(1000);    // 1S打印一次 Leo.Zheng

static DWORD dwLastThreadTime = 0;
static DWORD dwLastTickTime = 0;
DWORD dwCurrentThreadTime = 0;
DWORD dwCurrentTickTime = 0;
DWORD dwCpuPower = 0;

FILETIME ftCreationTime;
FILETIME ftExitTime;
FILETIME ftKernelTime;
FILETIME ftUserTime;

SuspendThread(hIdleThread);

dwCurrentTickTime = GetTickCount();
GetThreadTimes(hIdleThread,&ftCreationTime,&ftExitTime,&ftKernelTime,&ftUserTime);
dwCurrentThreadTime = GetThreadTick(&ftKernelTime,&ftUserTime);

// 计算 CPU 占用率
if(dwCurrentTickTime != dwLastTickTime || 0 != dwLastThreadTime || 0 != dwLastTickTime)
{
dwCpuPower = 100 - (((dwCurrentThreadTime - dwLastThreadTime) * 100) / (dwCurrentTickTime - dwLastTickTime));
}
else
{
dwCpuPower = 0;
}

// save status
dwLastTickTime = GetTickCount();
dwLastThreadTime = dwCurrentThreadTime;

printf("CPU loaded: %d%%\r\n",dwCpuPower);

ResumeThread(hIdleThread);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: