WinCE 下 CPU 使用率的计算方法

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

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

 1 static void CallCountCpuIdleThread(CCountCpuDlg *pCCountCpuDlg)
 2 {
 3  DWORD dwStartTick;
 4  DWORD dwIdleStart;
 5  DWORD dwStopTick;
 6  DWORD dwIdleEnd;
 7  int   nPresentIdle;
 8  int   nCpuUage[10]={0};
 9  int   nCount=0;
10  int   ave=0;
11  DWORD sum=0;
12  int i;
13
14  while(1)
15  {
16   dwStartTick=GetTickCount();    // 此处为关键代码 Leo.Zheng
17   dwIdleStart=GetIdleTime();
18   Sleep(100);
19   dwStopTick=GetTickCount();
20   dwIdleEnd=GetIdleTime();
21
22   nPresentIdle=(100*(dwIdleEnd-dwIdleStart))/((dwStopTick-dwStartTick));
23   // 算法多次的一个平均值 Leo.Zheng
24   if(nCount<10)
25   {
26    nCpuUage[nCount]=nPresentIdle;
27    nCount++;
28    if(nCount==10)
29    {
30     for(i=0;i<10;i++)
31      sum+=nCpuUage[i];
32     ave=sum/10;
33     // g_nCpuIdle only read in the main thread
34     g_nCpuIdle=ave;
35     nCount=0;
36     sum=0;
37     //RETAILMSG(1,(TEXT("CPU laoding is %d /r/n"),ave));
38     }
39   }
40  }
41 }  

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

 1 /*
 2 // 调用示例
 3 DWORD dwThreadID = 0;
 4 HANDLE hThread = NULL;
 5 hThread = CreateThread(NULL,0,ThreadPrintCpuLoad,this,0,&dwThreadID);
 6 if(NULL != hThread)
 7 {
 8     CloseHandle(hThread);
 9 }
10 */
11 static DWORD GetThreadTick(FILETIME *pFtKernel, FILETIME *pFtUser)
12 {
13     __int64 iKernel64 = 0;
14     __int64 iUser64 = 0;
15
16     iKernel64 = pFtKernel->dwHighDateTime;
17     iKernel64 <<= 32;
18     iKernel64 += pFtKernel->dwLowDateTime;
19
20     iUser64 = pFtUser->dwHighDateTime;
21     iUser64 <<= 32;
22     iKernel64 += pFtUser->dwLowDateTime;
23
24     iKernel64 += iUser64;
25
26     // nano sec to milli sec
27     iKernel64 /= 10000;
28
29     return (DWORD)iKernel64;
30 }
31
32 static void IdleThread(LPVOID pvParams)
33 {
34     while(1)
35     {
36     }
37 }
38
39 static DWORD ThreadPrintCpuLoad(LPVOID lpParameter)
40 {
41     DWORD dwThreadID = 0;
42     HANDLE hIdleThread = NULL;
43
44     SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);  // 设置高的优先级,保证 CPU 忙的时候也能打印 Leo
45
46     hIdleThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)IdleThread,NULL,CREATE_SUSPENDED,&dwThreadID);    // 创建低优先级空闲线程 Leo.Zheng
47     SetThreadPriority(hIdleThread,THREAD_PRIORITY_IDLE);
48     ResumeThread(hIdleThread);
49
50     while(1)
51     {
52         Sleep(1000);    // 1S打印一次 Leo.Zheng
53
54         static DWORD dwLastThreadTime = 0;
55         static DWORD dwLastTickTime = 0;
56         DWORD dwCurrentThreadTime = 0;
57         DWORD dwCurrentTickTime = 0;
58         DWORD dwCpuPower = 0;
59
60         FILETIME ftCreationTime;
61         FILETIME ftExitTime;
62         FILETIME ftKernelTime;
63         FILETIME ftUserTime;
64
65         SuspendThread(hIdleThread);
66
67         dwCurrentTickTime = GetTickCount();
68         GetThreadTimes(hIdleThread,&ftCreationTime,&ftExitTime,&ftKernelTime,&ftUserTime);
69         dwCurrentThreadTime = GetThreadTick(&ftKernelTime,&ftUserTime);
70
71         // 计算 CPU 占用率
72         if(dwCurrentTickTime != dwLastTickTime || 0 != dwLastThreadTime || 0 != dwLastTickTime)
73         {
74             dwCpuPower = 100 - (((dwCurrentThreadTime - dwLastThreadTime) * 100) / (dwCurrentTickTime - dwLastTickTime));
75         }
76         else
77         {
78             dwCpuPower = 0;
79         }
80
81         // save status
82         dwLastTickTime = GetTickCount();
83         dwLastThreadTime = dwCurrentThreadTime;
84
85         printf("CPU loaded: %d%%\r\n",dwCpuPower);
86
87         ResumeThread(hIdleThread);
88     }
89 }  
时间: 2024-12-17 04:15:54

WinCE 下 CPU 使用率的计算方法的相关文章

Linux下CPU使用率详解

CPU使用率其实就是你运行的程序占用的CPU资源,表示你的机器在某个时间点的运行程序的情况.使用率越高,说明你的机器在这个时间上运行了很多程序,反之较少 Top命令是Linux下常用的系统性能分析工具,能实时查看系统中各个进程资源占用情况 top - 10:02:17 up 14 days, 19:18, 4 users, load average: 2.11, 2.32, 2.14 Tasks: 251 total, 1 running, 247 sleeping, 3 stopped, 0

Linux 下 CPU 使用率与机器负载的关系与区别

原文链接:  http://blog.chinaunix.net/uid-28541347-id-4926054.html 当我们使用top命令查看系统的资源使用情况时会看到load average,如下图所示.它表示系统在1,5,15分钟的平均工作负载.那么什么事负载(load)呢?它和cpu的利用率又有什么关系呢? load average:系统平均负载是CPU的Load,它所包含的信息不是CPU的使用率状况,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CP

查看线程linux cpu使用率

Linux下如何查看高CPU占用率线程 LINUX CPU利用率计算 转 http://www.cnblogs.com/lidabo/p/4738113.html目录(?)[-] proc文件系统 proccpuinfo文件 procstat文件 procpidstat文件 procpidtasktidstat文件 系统中有关进程cpu使用率的常用命令 ps 命令 top命令 单核情况下Cpu使用率的计算 基本思想 总的Cpu使用率计算 计算方法 某一进程Cpu使用率的计算 计算方法 实验数据

cpu使用率的计算

proc文件系统 /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为内核与进程提供通信的接口.用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数.由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取/proc目录中的文件时,proc文件系统是动态从系统内核读出所需信息并提交的. /proc目录中有一些以数字命名的目录,它们是进程目录.系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,

一文秒懂CPU使用率

目录 CPU:Cores, and Hyper-Threading? 超线程(Hyper-Threading?) 多核(multi-cores) CPU使用率计算 CPU使用率测试 如何计算CPU使用率 实现CPU使用率统计程序 CPU:Cores, and Hyper-Threading? 超线程(Hyper-Threading?) 超线程是Intel最早提出一项技术,最早出现在2002年的Pentium4上.单个采用超线程的CPU对于操作系统来说就像有两个逻辑CPU,为此P4处理器需要多加入

转载 - LINUX下查看CPU使用率的命令

几个常用的命令,一些不错的解释 http://blog.csdn.net/wengpingbo/article/details/6302058 1.top 使用权限:所有使用者 使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 说明:即时显示process的动态 d :改变显示的更新速度,或是在交谈式指令列( interactive command)按s q :没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的

LINUX下查看CPU使用率的命令[Z]

1.top 使用权限:所有使用者 使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b] 说明:即时显示process的动态 d :改变显示的更新速度,或是在交谈式指令列( interactive command)按s q :没有任何延迟的显示速度,如果使用者是有superuser的权限,则top将会以最高的优先序执行 c :切换显示模式,共有两种模式,一是只显示执行档的名称,另一种是显示完整的路径与名称S :累积模式,会将己完成或消失的子行程( d

PHP 之获取Windows下CPU、内存的使用率

<?php /** * Created by PhpStorm. * User: 25754 * Date: 2019/5/4 * Time: 13:42 */ class SystemInfoWindows { /** * 判断指定路径下指定文件是否存在,如不存在则创建 * @param string $fileName 文件名 * @param string $content 文件内容 * @return string 返回文件路径 */ private function getFilePa

Windows下用C语言获取进程cpu使用率,内存使用,IO情况

#ifndef PROCESS_STAT_H #define PROCESS_STAT_H #ifdef __cplusplus extern “C” { #endif typedef long long int64_t; typedef unsigned long long uint64_t; /// 获取当前进程的cpu使用率,返回-1失败 int get_cpu_usage(); /// 获取当前进程内存和虚拟内存使用量,返回-1失败,0成功 int get_memory_usage(ui