2010-03-19 6 views
5

Come posso calcolare l'utilizzo della CPU e del disco di un altro programma concorrente? Cioè un programma è in esecuzione e altri calcola il primo utilizzo delle risorse.Monitoraggio dell'utilizzo della CPU e del disco di un singolo programma

Utilizzo C e C++ e in esecuzione su Windows XP.

+5

"Voglio che il codice" è qualcosa che dici quando sei un manager di programmatori in un'azienda. Sai, lavoro. Aiutiamo, non lavoro. :) – GManNickG

+1

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. –

+0

'top'? ________ – kennytm

risposta

1

È possibile, come Process Explorer può farlo, ma penso che sarà necessario utilizzare una sorta di API Windows non documentata. PSAPI è piuttosto vicino, ma fornisce solo le informazioni sull'utilizzo della memoria, non l'utilizzo della CPU o del disco.

10

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.