获取系统CPU 使用率
来源:互联网 发布:linux tmp目录怎么进入 编辑:程序博客网 时间:2024/05/22 05:49
废话不多说了,网上存在一种获取CPU使用率的方法是有bug的。也不知道有多少使用该方法的人没注意这个问题了,反正我是看到有人直接复制了这个代码。
来看一下 FILETIME的结构:
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME, *LPFILETIME;
这个结构是64位的。ok,上个我调试的截图来证明一下,为什么出错
eax 是32的,shl eax,20h 也是还是他自己。没有任何改变;
注意到 __int64 和 FILETIME都是64位的。所以可以直接转换。
__int64 a = *(__int64*)&time1; //只有一个赋值操作。什么左移,或操作,都不用了。可以少执行几条指令。
ok, 网上的代码一般可以参考,不可直接复制使用的。英文网站的代码,bug比较少。
ok, 展示一份,我参考外文,简化的代码吧。
SmarkLock.hpp
#pragma once#include <wtypes.h>class CSmartLock{public:CSmartLock(CRITICAL_SECTION& ref_cs){m_cs = ref_cs;EnterCriticalSection(&m_cs);}~CSmartLock(){LeaveCriticalSection(&m_cs);}private:CRITICAL_SECTION m_cs;};
CPU.hpp
#pragma once#include "SmarkLock.hpp"#include <wtypes.h>#define DELAY_DIFF200#define DATA_COUNT (1000/DELAY_DIFF)class CDelay{public:inline void Mark(){ m_mark = ::GetTickCount(); }inline int MSec(){ return (::GetTickCount() - m_mark) & 0x7FFFFFFF; }private:DWORD m_mark;};class CCPU{public:CCPU();~CCPU();int GetUsage();private:static CDelays_delay;static ints_count;static int s_index;static ints_lastCpu;static int s_cpu[DATA_COUNT];static __int64 s_time;static __int64 s_idleTime;static __int64 s_kernelTime;static __int64 s_userTime;CRITICAL_SECTION m_lock;};CDelayCCPU::s_delay;intCCPU::s_count = 0;intCCPU::s_index = 0;intCCPU::s_lastCpu = 0;intCCPU::s_cpu[DATA_COUNT];__int64 CCPU::s_time = 0;__int64 CCPU::s_idleTime = 0;__int64 CCPU::s_kernelTime = 0;__int64 CCPU::s_userTime = 0;CCPU::CCPU(){::InitializeCriticalSection(&m_lock);s_delay.Mark();}CCPU::~CCPU(){::DeleteCriticalSection(&m_lock);}int CCPU::GetUsage(){__int64 sTime;int sLastCpu;#define LOCK_START{ CSmartLock lock(m_lock);#define LOCK_END}LOCK_STARTsTime = s_time;sLastCpu = s_lastCpu;LOCK_ENDif (s_delay.MSec() <= DELAY_DIFF)return sLastCpu;__int64 time;__int64 idleTime;__int64 kernelTime;__int64 userTime;GetSystemTimeAsFileTime((LPFILETIME)&time);GetSystemTimes((LPFILETIME)&idleTime,(LPFILETIME)&kernelTime,(LPFILETIME)&userTime);if (0 == sTime){LOCK_STARTs_time= time;s_idleTime= idleTime;s_kernelTime= kernelTime;s_userTime= userTime;s_lastCpu= 0;sLastCpu= s_lastCpu;LOCK_ENDs_delay.Mark();return sLastCpu;}int iCpu;LOCK_START__int64 usr = userTime - s_userTime;__int64 ker = kernelTime - s_kernelTime;__int64 idl = idleTime - s_idleTime;__int64 sys = (usr + ker);if (0 == sys)iCpu = 0;elseiCpu = (int)((sys - idl) * 100 / sys);s_time= time;s_idleTime= idleTime;s_kernelTime= kernelTime;s_userTime= userTime;s_cpu[(s_index++) % DATA_COUNT] = iCpu;s_count++;if (s_count > DATA_COUNT)s_count = DATA_COUNT;int i;iCpu = 0;for (i = 0; i < s_count; i++)iCpu += s_cpu[i];iCpu /= s_count;s_lastCpu = iCpu;sLastCpu = s_lastCpu;LOCK_ENDs_delay.Mark();return sLastCpu;}
test.cpp
#include "CPU.hpp"#include <stdio.h>void main(){CCPU testCpu;while (true){static int count = 0;Sleep(DELAY_DIFF);count++;int iCpu = testCpu.GetUsage();if (count%(1000/DELAY_DIFF) == 0)printf("%d\n", iCpu);}}
阅读全文
0 0
- 获取系统CPU 使用率
- 获取系统的CPU使用率、内存使用率
- 【Delphi】获取系统CPU使用率
- 获取linux系统CPU使用率
- [系统级] 获取CPU使用率
- 【系统信息获取】5,获取CPU当前使用率
- 获取进程cpu使用率
- 如何获取CPU使用率
- 获取当前CPU使用率
- 获取CPU使用率
- VC++获取CPU使用率
- 获取总CPU使用率
- VC++获取CPU使用率
- 实时获取CPU使用率
- VC++获取CPU使用率
- Perl 获取cpu使用率
- C++获取CPU使用率
- Android -- 获取CPU使用率
- 处理对象的多种状态及其相互转换——状态模式(二)
- BZOJ1412 [ZJOI2009]狼和羊的故事 【最小割】
- 419. Battleships in a Board(C++)
- java根据经纬度坐标计算两点的距离算法
- linux 打包与解压
- 获取系统CPU 使用率
- 【Scikit-Learn 中文文档】数据集加载工具
- 【Scikit-Learn 中文文档】随机投影
- Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a
- 手机扫描行驶证识别应用
- 第四章:语句与第五章:操作符和表达式
- java实现文件下载的两种方式
- 【Scikit-Learn 中文文档】内核近似
- 文章标题