Per quanto riguarda l'utilizzo della CPU non è difficile da fare dopo aver dato un'occhiata a questo link Windows C++ Get CPU and Memory Utilisation With Performance Counters. Per quanto ho capito (ma non ho testato) è anche possibile scoprire l'utilizzo del disco.
L'idea è di utilizzare Performance Counters. Nella tua situazione è necessario utilizzare il contatore delle prestazioni L"\\Process(program_you_are_interested_in_name)\\% Processor Time"
per l'utilizzo della CPU ed eventualmente L"\\Process(program_you_are_interested_in_name)\\Data Bytes/sec"
per le operazioni del disco. Poiché non sono sicuro di quali parametri è necessario conoscere esattamente sulle operazioni del disco, è possibile dare un'occhiata all'elenco di tutti i parametri disponibili: Process Object
Se ad esempio si dispone di un programma concorrente con il nome a_program_name.exe
è possibile trovare il relativo Utilizzo della CPU che misura almeno il doppio del contatore delle prestazioni L"\\Process(a_program_name)\\% Processor Time"
. Nell'esempio è fatto in un ciclo. Misurando con questo test, un'applicazione multithread in esecuzione su un processore multicore potrebbe fornire un utilizzo della CPU superiore al 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:
;
}
C'è ancora una cosa da ricordare. PdhExpandWildCardPath
consente di espandere una stringa come questa L"\\Process(*)\\% Processor Time"
in un elenco di processi in esecuzione su un computer. E quindi è possibile interrogare i contatori delle prestazioni per ogni processo.
fonte
2010-03-19 11:05:08
"Voglio che il codice" è qualcosa che dici quando sei un manager di programmatori in un'azienda. Sai, lavoro. Aiutiamo, non lavoro. :) – GManNickG
GMan: Troppo vero. Sono stato così sicuro che i miei occhi lo reinterpretano adesso? Penso che sia comune per gli utenti non anglofoni usare questa frase quando intendono chiedere aiuto o sapere quali API ("il codice") sono utili. –
'top'? ________ – kennytm