#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!
Комментариев нет:
Отправить комментарий