2010-03-19 8 views
5

Wie kann ich die CPU- und Festplattenauslastung eines anderen parallelen Programms berechnen? I.e. ein Programm läuft und andere berechnen die Ressourcennutzung des ersten.Überwachung der CPU- und Festplattenauslastung eines einzelnen Programms

Ich benutze C und C++ und läuft unter Windows XP.

+5

"Ich möchte den Code" ist etwas, was Sie sagen, wenn Sie ein Manager von Programmierern in einem Unternehmen sind. Weißt du, arbeite. Wir helfen, nicht arbeiten. :) – GManNickG

+1

GMan: Zu wahr. War ich so verletzt, dass meine Augen das jetzt neu interpretieren? Ich denke, es ist üblich, dass Nicht-Englisch-Sprecher diesen Satz verwenden, wenn sie meinen, dass sie Hilfe benötigen oder wissen, welche APIs ("der Code") nützlich sind. –

+0

'oben'? ________ – kennytm

Antwort

1

Es ist möglich, als Process Explorer kann es tun, aber ich denke, Sie müssen eine Art undokumentierte Windows-API verwenden. PSAPI kommt etwas nahe, aber es gibt Ihnen nur die Speicherauslastungsinformationen, nicht die CPU- oder Festplattenauslastung.

10

Wie für die CPU-Nutzung ist es nicht schwer, nach dem Blick auf diesen Link Windows C++ Get CPU and Memory Utilisation With Performance Counters zu tun. Soweit ich es verstehe (aber nicht getestet habe), ist es auch möglich, die Festplattenauslastung herauszufinden.

Die Idee ist, Performance Counters zu verwenden. In Ihrer Situation müssen Sie den Leistungszähler L"\\Process(program_you_are_interested_in_name)\\% Processor Time" für CPU-Auslastung und möglicherweise L"\\Process(program_you_are_interested_in_name)\\Data Bytes/sec" für Datenträgervorgänge verwenden. Da ich bin nicht sicher, welche Parameter Sie Plattenoperationen wissen müssen genau können Sie ein, sich in der Liste aller verfügbaren Parameter betrachten: Process Object

Wenn Sie zum Beispiel ein konkurrierendes Programm mit dem Namen haben a_program_name.exe können Sie finden die CPU-Auslastung mindestens zweimal den Leistungszähler messen L"\\Process(a_program_name)\\% Processor Time". Im Beispiel wird es in einer Schleife gemacht. Übrigens kann eine Multithread-Anwendung, die auf einem Multicore-Prozessor läuft, eine CPU-Auslastung von mehr als 100% ergeben.

#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: 
    ; 
} 

Es gibt noch etwas zu erwähnen. PdhExpandWildCardPath können Sie eine Zeichenfolge wie diese L"\\Process(*)\\% Processor Time" in einer Liste von Prozessen auf einem Computer erweitern. Und dann können Sie Leistungsindikatoren für jeden Prozess abfragen.

Verwandte Themen