Страницы

Поиск по вопросам

среда, 4 марта 2020 г.

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

#cpp #c #windows #winapi


Здравствуйте, пытаюсь разбираться с 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;
}


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


Ответы

Ответ 1



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

Ответ 2



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

Комментариев нет:

Отправить комментарий