2010-03-19 8 views
5

¿Cómo puedo calcular el uso de CPU y disco de otro programa simultáneo? Es decir. un programa se está ejecutando y otro calcula el uso del primer recurso.Monitoreo de CPU y uso de disco de un solo programa

Estoy usando C y C++ y estoy ejecutando bajo Windows XP.

+5

"Quiero el código" es algo que dices cuando eres administrador de programadores en una empresa. Ya sabes, trabajo. Ayudamos, no trabajamos :) – GManNickG

+1

GMan: Demasiado cierto. ¿He estado tan interesado que mis ojos lo reinterpretan ahora? Creo que es común que quienes no hablan inglés usen esa frase cuando quieren decir que quieren ayuda o para saber qué API ("el código") son útiles. –

+0

'top'? ________ – kennytm

Respuesta

1

Es posible, como Process Explorer puede hacerlo, pero creo que tendrá que usar algún tipo de API de Windows no documentada. PSAPI se acerca un poco, pero solo proporciona la información de uso de la memoria, no la utilización de la CPU o del disco.

10

En cuanto a la utilización de la CPU no es difícil de hacer después de echar un vistazo a este enlace Windows C++ Get CPU and Memory Utilisation With Performance Counters. Por lo que yo entiendo (pero no he probado) también es posible descubrir la utilización del disco.

La idea es usar Performance Counters. En su situación, debe utilizar el contador de rendimiento L"\\Process(program_you_are_interested_in_name)\\% Processor Time" para la utilización de CPU y posiblemente L"\\Process(program_you_are_interested_in_name)\\Data Bytes/sec" para operaciones de disco. Como no estoy seguro de qué parámetros necesita conocer exactamente sobre las operaciones del disco, puede consultar la lista de todos los parámetros disponibles: Process Object

Si, por ejemplo, tiene un programa simultáneo con el nombre a_program_name.exe, puede encontrar su Uso de la CPU que mide al menos el doble del contador de rendimiento L"\\Process(a_program_name)\\% Processor Time". En el ejemplo, se hace en un bucle. Por cierto, al medir con esta prueba, una aplicación multiproceso que se ejecute en un procesador multinúcleo podría proporcionar una utilización de CPU que es más del 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: 
    ; 
} 

Hay una cosa más que mencionar. PdhExpandWildCardPath le permite expandir una cadena como esta L"\\Process(*)\\% Processor Time" en una lista de procesos que se ejecutan en una computadora. Y luego puede consultar los contadores de rendimiento para cada proceso.

Cuestiones relacionadas