1 #pragma once 2 #include "base.h" 3 #include "MathBase.h" 4 5 #include "windows.h" 6 #include "../msvc/msvc_fix.h" 7 #include <windows.h> 8 #include <shlobj.h> 9 #include <shlwapi.h> 10 #include "Timer.h" 11 12 class ESCpuUsage 13 { 14 private: 15 FILETIME m_LastIdleTime; 16 FILETIME m_LastKernelTime; 17 FILETIME m_LastUserTime; 18 FILETIME m_LastESKernelTime; 19 FILETIME m_LastESUserTime; 20 Base::CTimer m_Timer; 21 fp8 m_LastCPUCheckTime; 22 public: ESCpuUsage()23 ESCpuUsage(): m_LastCPUCheckTime(0) 24 { 25 m_Timer.Reset(); 26 m_LastCPUCheckTime = m_Timer.Time(); 27 GetSystemTimes( &m_LastIdleTime, &m_LastKernelTime, &m_LastUserTime ); 28 } GetCpuUsage(int & _total,int & _es)29 bool GetCpuUsage(int &_total, int &_es) 30 { 31 FILETIME dummy1; 32 FILETIME dummy2; 33 FILETIME idleTime; 34 FILETIME kernelTime; 35 FILETIME userTime; 36 LARGE_INTEGER usr; 37 LARGE_INTEGER ker; 38 LARGE_INTEGER idl; 39 40 SYSTEM_INFO sysinfo; 41 GetSystemInfo( &sysinfo ); 42 43 fp8 newtime = m_Timer.Time(); 44 if (GetProcessTimes(GetCurrentProcess(), &dummy1, &dummy2, &kernelTime, &userTime ) != 0) 45 { 46 usr.LowPart = userTime.dwLowDateTime - m_LastESUserTime.dwLowDateTime; 47 usr.HighPart = userTime.dwHighDateTime- m_LastESUserTime.dwHighDateTime; 48 ker.LowPart = kernelTime.dwLowDateTime - m_LastESKernelTime.dwLowDateTime; 49 ker.HighPart = kernelTime.dwHighDateTime - m_LastESKernelTime.dwHighDateTime; 50 51 fp8 period = newtime - m_LastCPUCheckTime; 52 if (period > 0.) 53 { 54 _es = int ( (ker.QuadPart + usr.QuadPart) * 100. / (period*1e+7) / sysinfo.dwNumberOfProcessors ); 55 } 56 else 57 _es = 0; 58 _es = ::Base::Math::Clamped(_es, 0, 100); 59 m_LastESKernelTime = kernelTime; 60 m_LastESUserTime = userTime; 61 } else 62 return false; 63 m_LastCPUCheckTime = newtime; 64 65 if (GetSystemTimes( &idleTime, &kernelTime, &userTime ) != 0) 66 { 67 usr.LowPart = userTime.dwLowDateTime - m_LastUserTime.dwLowDateTime; 68 usr.HighPart = userTime.dwHighDateTime- m_LastUserTime.dwHighDateTime; 69 ker.LowPart = kernelTime.dwLowDateTime - m_LastKernelTime.dwLowDateTime; 70 ker.HighPart = kernelTime.dwHighDateTime - m_LastKernelTime.dwHighDateTime; 71 idl.LowPart = idleTime.dwLowDateTime - m_LastIdleTime.dwLowDateTime; 72 idl.HighPart = idleTime.dwHighDateTime - m_LastIdleTime.dwHighDateTime; 73 74 if (ker.QuadPart + usr.QuadPart != 0) 75 { 76 _total = int ( (ker.QuadPart + usr.QuadPart - idl.QuadPart) * 100 / (ker.QuadPart + usr.QuadPart) ); 77 } 78 else 79 _total = 0; 80 _total = ::Base::Math::Clamped(_total, 0, 100); 81 m_LastIdleTime = idleTime; 82 m_LastKernelTime = kernelTime; 83 m_LastUserTime = userTime; 84 } 85 else 86 return false; 87 return true; 88 } 89 };