2011-04-07 18 views
5

विंडोज के तहत, ऑपरेटिंग सिस्टम भाषा के आधार पर प्रदर्शन काउंटर के अलग-अलग नाम होते हैं। उदाहरण के लिए, एक अंग्रेजी विंडोज संस्करण पर, प्रदर्शन काउंटर \Processor(_Total)\% Processor Time है। जर्मन काउंटर संस्करण पर एक ही काउंटर को \Prozessor(_Total)\Prozessorzeit (%) कहा जाता है।किसी भाषा-स्वतंत्र तरीके से प्रदर्शन काउंटर मान पुनर्प्राप्त करें

क्या किसी भाषा-स्वतंत्र तरीके से प्रदर्शन काउंटर मान पुनर्प्राप्त करने का कोई तरीका है (सी ++ या सी # का उपयोग करके)? या प्रदर्शन काउंटर के बिना पूरे कंप्यूटर के प्रोसेसर लोड प्राप्त करने का कोई विकल्प है?

+0

क्या आपने जर्मन मशीन पर अपने कोड में अंग्रेजी नाम का उपयोग करके * कोशिश की है? –

+2

हां, मैंने कोशिश की है और मुझे त्रुटि संदेश मिलता है कि काउंटर नहीं मिल सकता है। –

उत्तर

7

प्रत्येक परफमन काउंटर को पेर्फमॉन काउंटर की पहचान करने के लिए एक अद्वितीय (प्रति मशीन) पूर्णांक आईडी दी जाती है (हालांकि मानक काउंटर के मामले में इस आईडी को रहने के लिए गारंटी दी जाती है)।

परफ़ॉर्मेंस को जोड़ने जानकारी आईडी के काउंटरों दोनों अपने अमेरिका अंग्रेजी नाम करने के लिए और उनके स्थानीय नाम कुंजी निम्नलिखित में रजिस्ट्री में संग्रहित किया जाता है:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib 

एक बार जब आप रजिस्ट्री परफ़ॉर्मेंस काउंटर नाम प्राप्त करने के लिए इस्तेमाल किया है (जिसे आप मानक काउंटर के लिए निरंतर के रूप में अपने ऐप में एम्बेड कर सकते हैं) आप दिए गए काउंटर आईडी के लिए स्थानीय नाम देखने के लिए PdhLookupPerfNameByIndex फ़ंक्शन का उपयोग कर सकते हैं। अधिक जानकारी के लिए

Using PDH APIs correctly in a localized language (Microsoft KB) देखें।

आपको कुछ भी प्रासंगिक Finding perfmon counter id via winreg (StackOverflow) मिल सकता है।

+0

मैंने आईडी की तुलना की और उनमें से कुछ अन्य कंप्यूटरों पर अलग हैं। लेकिन एक कामकाज है: मैं अंग्रेजी नाम का उपयोग कर "00 9" कुंजी में आईडी की तलाश करता हूं, फिर मैं PdhLookupPerfNameByIndex फ़ंक्शन का उपयोग करके स्थानीय नाम की तलाश करता हूं। स्रोत कोड: http://wojciechkulik.pl/csharp/get-a-performancecounter-using-english-name –

0

WinAPI फ़ंक्शन, QueryHighPerformanceCounter और QueryHighPerformanceFrequency हैं।

+0

वास्तव में नामों में कोई "उच्च" नहीं है! – Nawaz

+0

ये फ़ंक्शंस उच्च-परिशुद्धता टाइमर के मान लौटाते हैं जिनका उपयोग प्रदर्शन काउंटर के लिए किया जाता है। लेकिन आप \ Processor (_Total) \% प्रोसेसर समय जैसे प्रदर्शन काउंटर के मान को वापस करने के लिए इन फ़ंक्शंस का उपयोग नहीं कर सकते हैं। –

0

क्या आपने पीएचएच हेल्पर फ़ंक्शंस और PdhAddEnglishCounter फ़ंक्शन का उपयोग करने का प्रयास किया है?

+0

दुर्भाग्यवश, यह फ़ंक्शन केवल Vista, Windows Server 2008, और उच्चतर में उपलब्ध है। मुझे विंडोज एक्सपी और विंडोज सर्वर 2003 पर प्रदर्शन काउंटर पुनर्प्राप्त करने की भी आवश्यकता है। –

0

अपनी कक्षा आयात DLL में इस

using System.Runtime.InteropServices; 
using Microsoft.Win32; 

जोड़ें (मेरी वर्गीकृत कार्यक्रम का नाम है)

[DllImport("pdh.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
     static extern UInt32 PdhLookupPerfIndexByName(string szMachineName, string szNameBuffer, ref uint pdwIndex); 

अपने OS भाषा में आप चाहते हैं काउंटर के नाम भेजें और यह अंग्रेज़ी वापसी NAME

public string GetEnglishName(string name) 
     { 
      string buffer2 = name; 
      UInt32 iRet2 = new UInt32(); 
      iRet3 = PdhLookupPerfIndexByName(null, buffer2, ref iRet2); 
      //Console.WriteLine(iRet2.ToString()); 

      RegistryKey pRegKey = Registry.LocalMachine; 
      pRegKey = pRegKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009"); 
      string[] after; 
      after = (string[])pRegKey.GetValue("Counter"); 
      string value = iRet2.ToString(); 
      int pos = Array.IndexOf(after, value); 
      return after[pos + 1]; 
     } 

यहाँ कैसे यह

012 उपयोग करने के लिए है
Program m = new Program(); 
      string result = m.GetEnglishName("Mémoire"); 
      Console.WriteLine(result); 
संबंधित मुद्दे