WinCE 下 CPU 使用率的计算方法
2016-02-21 16:13
393 查看
在函数 GetIdleTime 的用法中,MSDN 推荐的 CPU 使用率的计算方法,在部分平台下使用时得到的使用率异常:非 0-100% 的数值。
先看看 MSDN 推荐的算法的大概实现:
不使用 GetIdleTime 的计算 CPU 使用率的方法及调用示例如下:
先看看 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); } }
相关文章推荐
- Android机器视觉实现框架
- DRP之旅(1)——Servlet初探
- 循环结构(for语句)
- Java并发编程:Thread类的使用
- 高性能Mysql主从架构的复制原理及配置详解
- PHP Jquery 代码操作 内容 属性 样式 事件 Json数据
- 如何通过 WinCE 访问 WAP 数据
- c语言入门之项目2.8——求1到m间的奇数和
- 一个简单实用的C++内存池
- Viewpager的用法
- 利用Qt调用计算器
- Android Wear 进阶 2 Creating Wearable Apps-创建手表程序
- xnl 之 处理指令
- MyMVC框架的使用
- python基础0221
- 组合算法(C语言+回溯)
- BestCoder Round #73 (div.2)-Rikka with Graph(图的连通性)
- Android Studio在类中找不到R文件
- 将meteor部署到自己的服务器(deploy meteor to your own server)
- 【转】C语言->数组名与指针