Что касается использования ЦП, это не сложно сделать после просмотра этой ссылки Windows C ++ Получить использование ЦП и памяти с помощью счетчиков производительности . Насколько я понимаю (но не проверял), также можно узнать использование диска.
Идея состоит в том, чтобы использовать Счетчики производительности . В вашей ситуации вам нужно использовать счетчик производительности L"\\Process(program_you_are_interested_in_name)\\% Processor Time"
для загрузки ЦП и, возможно, L"\\Process(program_you_are_interested_in_name)\\Data Bytes/sec"
для операций с диском. Поскольку я не уверен, какие именно параметры вам нужно знать о дисковых операциях, вы можете самостоятельно просмотреть список всех доступных параметров: Объект процесса
Если, например, у вас есть параллельная программа с именем a_program_name.exe
, вы можете обнаружить, что ее загрузка ЦП измеряет как минимум вдвое больше счетчика производительности L"\\Process(a_program_name)\\% Processor Time"
. В примере это сделано в цикле. Кстати, при измерении с помощью этого теста многопоточное приложение, работающее на многоядерном процессоре, может дать загрузку процессора, которая составляет более 100%.
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <pdh.h>
#include <pdhmsg.h>
#include <string.h>
#include <string>
#include <iostream>
// Put name of your process here!!!!
CONST PWSTR COUNTER_PATH = L"\\Process(a_program_name)\\% Processor Time";
void main(int argc, char *argv[]){
PDH_HQUERY hquery;
PDH_HCOUNTER hcountercpu;
PDH_STATUS status;
LPSTR pMessage;
PDH_FMT_COUNTERVALUE countervalcpu;
if((status=PdhOpenQuery(NULL, 0, &hquery))!=ERROR_SUCCESS){
printf("PdhOpenQuery %lx\n", status);
goto END;
}
if((status=PdhAddCounter(hquery,COUNTER_PATH,0, &hcountercpu))!=ERROR_SUCCESS){
printf("PdhAddCounter (cpu) %lx\n", status);
goto END;
}
/*Start outside the loop as CPU requires difference
between two PdhCollectQueryData s*/
if((status=PdhCollectQueryData(hquery))!=ERROR_SUCCESS){
printf("PdhCollectQueryData %lx\n", status);
goto END;
}
while(true){
if((status=PdhCollectQueryData(hquery))!=ERROR_SUCCESS){
printf("PdhCollectQueryData %lx\n", status);
goto END;
}
if((status=PdhGetFormattedCounterValue(hcountercpu, PDH_FMT_LONG | PDH_FMT_NOCAP100, 0, &countervalcpu))!=ERROR_SUCCESS){
printf("PdhGetFormattedCounterValue(cpu) %lx\n", status);
goto END;
}
printf("cpu %3d%%\n", countervalcpu.longValue);
Sleep(1000);
}
END:
;
}
Есть еще одна вещь, которую стоит упомянуть. PdhExpandWildCardPath
позволяет развернуть строку, подобную этой, L"\\Process(*)\\% Processor Time"
в списке процессов, запущенных на компьютере. И тогда вы можете запросить счетчики производительности для каждого процесса.