2010-03-19 9 views
5

मैं एक और समवर्ती कार्यक्रम के सीपीयू और डिस्क उपयोग की गणना कैसे कर सकता हूं? अर्थात। एक प्रोग्राम चल रहा है और दूसरा पहले संसाधन संसाधन की गणना करता है।एक प्रोग्राम के सीपीयू और डिस्क उपयोग की निगरानी

मैं सी और सी ++ का उपयोग कर रहा हूं और विंडोज एक्सपी के तहत चल रहा हूं।

+5

"मैं कोड चाहता हूं" कुछ ऐसा है जो आप किसी कंपनी में प्रोग्रामर के प्रबंधक होते हैं। आप जानते हैं, काम करते हैं। हम काम नहीं करते, मदद करते हैं। :) – GManNickG

+1

जीएमएन: बहुत सच है। क्या मैं इतना बीमार हुआ हूं कि मेरी आंखें अब दोबारा बताती हैं? मुझे लगता है कि गैर-अंग्रेजी बोलने वालों के लिए उस वाक्यांश का उपयोग करना आम बात है जब उनका मतलब है कि वे मदद चाहते हैं या जानना चाहते हैं कि कौन से एपीआई ("कोड") उपयोगी हैं। –

+0

'शीर्ष'? ________ – kennytm

उत्तर

1

यह संभव है, क्योंकि प्रोसेस एक्सप्लोरर ऐसा कर सकता है, लेकिन मुझे लगता है कि आपको किसी प्रकार के अनियंत्रित विंडोज एपीआई का उपयोग करना होगा। पीएसएपीआई कुछ हद तक करीब आता है, लेकिन यह आपको केवल स्मृति उपयोग जानकारी देता है, सीपीयू या डिस्क उपयोग नहीं।

10

सीपीयू उपयोग के लिए इस लिंक को देखने के बाद यह करना मुश्किल नहीं है Windows C++ Get CPU and Memory Utilisation With Performance Counters। जहां तक ​​मैं समझता हूं (लेकिन परीक्षण नहीं किया गया है) डिस्क उपयोग को ढूंढना भी संभव है।

विचार Performance Counters का उपयोग करना है। आपकी स्थिति में आपको डिस्क ऑपरेशन के लिए CPU उपयोग के लिए प्रदर्शन काउंटर L"\\Process(program_you_are_interested_in_name)\\% Processor Time" और संभावित रूप से L"\\Process(program_you_are_interested_in_name)\\Data Bytes/sec" का उपयोग करने की आवश्यकता है। चूंकि मुझे यकीन नहीं है कि आपको डिस्क ऑपरेशंस के बारे में जानने के लिए किन पैरामीटरों की आवश्यकता है, आप सभी उपलब्ध पैरामीटर की सूची में खुद को देख सकते हैं: Process Object

उदाहरण के लिए आपके पास a_program_name.exe नाम के साथ एक समवर्ती कार्यक्रम है सीपीयू उपयोग कम से कम दो बार प्रदर्शन काउंटर L"\\Process(a_program_name)\\% Processor Time" मापने। उदाहरण में यह एक पाश में किया जाता है। इस परीक्षण के साथ मापने के माध्यम से एक मल्टीकोर प्रोसेसर पर चलने वाला एक बहुप्रचारित अनुप्रयोग CPU उपयोग प्रदान कर सकता है जो 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: 
    ; 
} 

उल्लेख करने के लिए एक और बात है। PdhExpandWildCardPath आपको कंप्यूटर पर चल रही प्रक्रियाओं की सूची में इस L"\\Process(*)\\% Processor Time" जैसी स्ट्रिंग का विस्तार करने देता है। और फिर आप प्रत्येक प्रक्रिया के लिए प्रदर्शन काउंटर से पूछ सकते हैं।

संबंधित मुद्दे