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 };