2010-11-01 5 views
2

J'essaie d'utiliser les compteurs de performance Windows pour obtenir l'utilisation des octets virtuels d'un processus spécifique. Il m'a semblé plus simple de lire l'utilisation du% processeur, alors j'ai pensé que j'essaierais de faire en sorte que ça marche en premier.Pourquoi mon code de compteur de performance ne fonctionne-t-il pas?

En haut du fichier, j'ai ceci:

#include <pdh.h> 
#include <pdhmsg.h> 

Puis, en fonction, j'ai ceci:

PDH_STATUS status = ERROR_SUCCESS; 

PDH_HQUERY query = NULL; 
status = PdhOpenQuery(
    NULL, 
    0, 
    &query); 
CHECK(status == ERROR_SUCCESS, L"Couldn't create query."); 

PDH_HCOUNTER counter = NULL; 
status = PdhAddCounter(query, L"\\Processor(_Total)\\% Processor Time", 0, &counter); 
CHECK(status == ERROR_SUCCESS, L"Couldn't add counter."); 

status = PdhCollectQueryData(query); 
CHECK(status == ERROR_SUCCESS, L"Couldn't collect query data."); 
Sleep(2000); 

status = PdhCollectQueryData(query); 
CHECK(status == ERROR_SUCCESS, L"Couldn't collect query data."); 
Sleep(2000); 

PDH_RAW_COUNTER rawValue; 
status = PdhGetRawCounterValue(&counter, NULL, &rawValue); 
CHECK(status == ERROR_SUCCESS, L"Couldn't get the raw counter value."); 

status = PdhCloseQuery(&query); 
CHECK(status == ERROR_SUCCESS, L"Couldn't close the query handle."); 

CHECK est macro qui est utilisé sur le projet de faire valoir. L'état est ERROR_SUCCESS à chaque appel jusqu'à l'appel de PdhGetRawCounterValue(). Lorsque j'appelle cette fonction, le résultat est 0xC0000BBC qui est défini dans pdhmsg.h comme PDH_INVALID_HANDLE. La raison de l'appel à Sleep() est que this page indique que vous devez lire deux échantillons pour certains compteurs et attendre au moins une seconde entre les deux.

Est-ce que je fais quelque chose de mal?

Répondre

3

Je pense que vous devez supprimer l'esperluette (ne prenez pas l'adresse du compteur):

status = PdhGetRawCounterValue(counter, NULL, &rawValue); 

Et il semble que l'appel à PdhCloseQuery aussi devrait être probablement pas passer l'adresse du paramètre.

status = PdhCloseQuery(query); 
Questions connexes