Узнать загруженность CPU C++

546
23 ноября 2017, 03:51

Здравствуйте, пытаюсь разбираться с WIN32 API, реши написать что-то на подобии диспетчера задач, но никак не могу понять как узнать нагруженность CPU и его температуру(если это возможно)... Понял как узнать архитектуру процессора :

LPCSTR getArchitecture()
{
    SYSTEM_INFO sysInfo;
    GetSystemInfo(&sysInfo);
    LPCSTR architecture;
    switch (sysInfo.wProcessorArchitecture)
    {
    case PROCESSOR_ARCHITECTURE_INTEL :
        architecture = "Intel x86";
        break;
    case PROCESSOR_ARCHITECTURE_IA64 :
        architecture = "Intel x64";
        break;
    case PROCESSOR_ARCHITECTURE_AMD64 :
        architecture = "AMD x64";
        break;
    case PROCESSOR_AMD_X8664:
        architecture = "AMD x86";
        break;
    default:
        architecture = "Unknow";
        break;  
    }
    return architecture;
}

Также понял, как узнать количество ядер процессора:

UINT const getCountCernels() 
{
    SYSTEM_INFO sysInfo;
    GetSystemInfo(&sysInfo);
    return sysInfo.dwNumberOfProcessors;
}

Хотелось бы получить внятный ответ как можно узнать нагруженность процессора желательно для каждого ядра...

Answer 1

Через PDH-функции, в общих чертах, загрузка ядра добывается так:

  1. Через PdhOpenQuery создается PDH_HQUERY
  2. Через PdhAddEnglishCounter с использованием запроса из п.1 инициализируются счетчики. Путь к счетчику - "\\Processor(0)\\%% Idle Time", где 0 - номер ядра
  3. Через PdhCollectQueryData получаются данные
  4. PdhGetFormattedCounterValue получает из счетчика значение. Нужно указать тип PDH_FMT_DOUBLE.
  5. Из 100 нужно вычесть полученное в п.5 значение
  6. ...
  7. PROFIT!
Answer 2

Температуру процессора вряд ли получится узнать без проблем, можно сделать WMI запрос по MSAcpi_ThermalZoneTemperature, но это даст только температуру где - то на материнской плате (это может быть далеко от процессора), и то, этого может не быть в материнке вообще. Правильным решением будет писать драйвера. Для этого нужно с помощью инструкции rdmsr получить IA32_THERM_STATUS, если мы говорим о 32 - bit Intel Architecture, для этого надо будет получить доступ в kernel space (ring 0 права)

READ ALSO
Узнать разрядность ОС Windows C++

Узнать разрядность ОС Windows C++

Здравствуйте, возник вопрос с тем, как узнать разрядность ОС WindowsПробовал через препроцессинг, но выдает неправильные данные

376
Данные из файла в вектор, массив типа point

Данные из файла в вектор, массив типа point

Всем доброго вечера, возник вопросИмеется файл, пусть будет обычный текстовый

350
getline в цикле С++

getline в цикле С++

Здраствуйте, такая проблема - нудно считать строку с пробелами в цикле while()делаю это через getline(cin, string); и при первом вхождении в цикл все ок, но при...

300