Я использую следующий метод для определения загрузки процессора:
#include "pch.h"
#include <iostream>
#include <Windows.h>
int get_CPU_Usage(void);
int main()
{
COORD c = {0};
HANDLE hStdOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
for(;; ::Sleep(500))
{
::SetConsoleCursorPosition(hStdOut, c);
wprintf(L"Current CPU usage: %d%%\t\t\n", get_CPU_Usage());
}
}
int get_CPU_Usage(void)
{
//RETURN: = CPU Usage in percent [0 - 100], or
// = -1 if error
int nRes = -1;
//Run system function
FILETIME ftIdle, ftKrnl, ftUsr;
if(::GetSystemTimes(&ftIdle, &ftKrnl, &ftUsr))
{
//Now calculate value
static BOOL bUsedOnce = FALSE;
static ULONGLONG uOldIdle = 0;
static ULONGLONG uOldKrnl = 0;
static ULONGLONG uOldUsr = 0;
ULONGLONG uIdle = ((ULONGLONG)ftIdle.dwHighDateTime << 32) | ftIdle.dwLowDateTime;
ULONGLONG uKrnl = ((ULONGLONG)ftKrnl.dwHighDateTime << 32) | ftKrnl.dwLowDateTime;
ULONGLONG uUsr = ((ULONGLONG)ftUsr.dwHighDateTime << 32) | ftUsr.dwLowDateTime;
//Only if we have previous values
if(bUsedOnce)
{
ULONGLONG uDiffIdle = uIdle - uOldIdle;
ULONGLONG uDiffKrnl = uKrnl - uOldKrnl;
ULONGLONG uDiffUsr = uUsr - uOldUsr;
if(uDiffKrnl + uDiffUsr)
{
//Calculate percentage
nRes = (int)((uDiffKrnl + uDiffUsr - uDiffIdle) * 100 / (uDiffKrnl + uDiffUsr));
//Check value and correct it (Just in case)
if(nRes < 0)
nRes = 0;
else if(nRes > 100)
nRes = 100;
}
}
//Remember data
bUsedOnce = TRUE;
uOldIdle = uIdle;
uOldKrnl = uKrnl;
uOldUsr = uUsr;
}
return nRes;
}
Раньше он давал сопоставимые показания на моем старом компьютере под управлением Windows 8.1, но теперь, когда я запускаю его на этом настольном компьютере с Intel(R) Core(TM) i9-7940X CPU @ 3.10GHz
в Windows 10 Pro, результаты, которые он мне дает, кажутся в 2 раза ниже, чем Диспетчер задач показывает:
Трудно поймать его на скриншоте, но я определенно мог видеть постоянно меньшие числа из моего кода выше.
Так мне интересно, почему такое неравенство?
PS. Процессор, на котором я тестирую, имеет 14 физических и 28 логических ядер. Может ли это как-то повлиять на вывод функции GetSystemTimes
?