short CProcessorUsage::GetUsage() { __int64 sTime; int sLastCpu; if (m_bLocked) return s_lastCpu; ::EnterCriticalSection( &m_cs ); m_bLocked = true; sTime = s_time; sLastCpu = s_lastCpu; if(((::GetTickCount() - s_TickMark) & 0x7FFFFFFF) <= 200) { if (m_bLocked) ::LeaveCriticalSection( &m_cs ); m_bLocked = false; return sLastCpu; } __int64 time; __int64 idleTime; __int64 kernelTime; __int64 userTime; __int64 kernelTimeProcess; __int64 userTimeProcess; ::GetSystemTimeAsFileTime((LPFILETIME)&time); if(!sTime) { GetSysTimes(idleTime, kernelTime, userTime); FILETIME createTime; FILETIME exitTime; ::GetProcessTimes(::GetCurrentProcess(), &createTime, &exitTime, (LPFILETIME)&kernelTimeProcess, (LPFILETIME)&userTimeProcess); s_time = time; s_idleTime = idleTime; s_kernelTime = kernelTime; s_userTime = userTime; s_kernelTimeProcess = kernelTimeProcess; s_userTimeProcess = userTimeProcess; s_lastCpu = 0; s_TickMark = ::GetTickCount(); if (m_bLocked) ::LeaveCriticalSection( &m_cs ); m_bLocked = false; return 0; } __int64 div = (time - sTime); if (div==0) { if (m_bLocked) ::LeaveCriticalSection( &m_cs ); m_bLocked = false; return sLastCpu; } GetSysTimes(idleTime, kernelTime, userTime); FILETIME createTime; FILETIME exitTime; ::GetProcessTimes(::GetCurrentProcess(), &createTime, &exitTime, (LPFILETIME)&kernelTimeProcess, (LPFILETIME)&userTimeProcess); int cpu; int cpuProcess; __int64 usr = userTime - s_userTime; __int64 ker = kernelTime - s_kernelTime; __int64 idl = idleTime - s_idleTime; __int64 sys = (usr + ker); if(sys) cpu = int((sys - idl) * 100 / sys); // System Idle take 100 % of cpu; else cpu = 0; cpuProcess = int((((userTimeProcess - s_userTimeProcess) + (kernelTimeProcess - s_kernelTimeProcess)) * 100 ) / div); s_time = time; s_idleTime = idleTime; s_kernelTime = kernelTime; s_userTime = userTime; s_kernelTimeProcess = kernelTimeProcess; s_userTimeProcess = userTimeProcess; s_cpu[s_index] = cpu; s_cpuProcess[s_index] = cpuProcess; s_index++; s_index%=5; s_count ++; if(s_count > 5) s_count = 5; cpu = 0; int i; for(i = 0; i < s_count; i++ ) cpu += s_cpu[i]; cpuProcess = 0; for(i = 0; i < s_count; i++ ) cpuProcess += s_cpuProcess[i]; cpu /= s_count; cpuProcess /= s_count; s_lastCpu = cpuProcess; sLastCpu = s_lastCpu; s_TickMark = ::GetTickCount(); if (m_bLocked) ::LeaveCriticalSection( &m_cs ); m_bLocked = false; return sLastCpu; }
float CProcessorUsage::GetUsage(bool processOnly) { __int64 sTime; float sLastCpu; //CCritSecLock cs(m_cs); sTime = s_time; sLastCpu = s_lastCpu; if(((::GetTickCount() - s_TickMark) & 0x7FFFFFFF) <= interval && !firstTime) return sLastCpu; firstTime=false; __int64 time; __int64 idleTime; __int64 kernelTime; __int64 userTime; __int64 kernelTimeProcess; __int64 userTimeProcess; ::GetSystemTimeAsFileTime((LPFILETIME)&time); if(!sTime) { GetSysTimes(idleTime, kernelTime, userTime); FILETIME createTime; FILETIME exitTime; ::GetProcessTimes(::GetCurrentProcess(), &createTime, &exitTime, (LPFILETIME)&kernelTimeProcess, (LPFILETIME)&userTimeProcess); s_time = time; s_idleTime = idleTime; s_kernelTime = kernelTime; s_userTime = userTime; s_kernelTimeProcess = kernelTimeProcess; s_userTimeProcess = userTimeProcess; s_lastCpu = 0; s_TickMark = ::GetTickCount(); return 0; } __int64 div = (time - sTime); GetSysTimes(idleTime, kernelTime, userTime); FILETIME createTime; FILETIME exitTime; ::GetProcessTimes(::GetCurrentProcess(), &createTime, &exitTime, (LPFILETIME)&kernelTimeProcess, (LPFILETIME)&userTimeProcess); float cpu; float cpuProcess; __int64 usr = userTime - s_userTime; __int64 ker = kernelTime - s_kernelTime; __int64 idl = idleTime - s_idleTime; __int64 sys = (usr + ker); if(sys) cpu = float((sys - idl) * 100 / sys); // System Idle take 100 % of cpu; else cpu = 0; cpuProcess = float((((userTimeProcess - s_userTimeProcess) + (kernelTimeProcess - s_kernelTimeProcess)) * 100 ) / div); s_time = time; s_idleTime = idleTime; s_kernelTime = kernelTime; s_userTime = userTime; s_kernelTimeProcess = kernelTimeProcess; s_userTimeProcess = userTimeProcess; s_cpu[(s_index ++) %5] = cpu; s_cpuProcess[(s_index++) %5] = cpuProcess; s_count ++; if(s_count > 5) s_count = 5; cpu = 0; int i; for(i = 0; i < s_count; i++ ) cpu += s_cpu[i]; cpuProcess = 0; for(i = 0; i < s_count; i++ ) cpuProcess += s_cpuProcess[i]; cpu /= s_count; cpuProcess /= s_count; s_lastCpu = processOnly ? cpuProcess : cpu; sLastCpu = s_lastCpu; s_TickMark = ::GetTickCount(); return sLastCpu; }