2011-04-04 7 views
7

मैं अपने प्रोग्राम सीपीयू उपयोग को कोर द्वारा विभाजित करने का प्रयास करता हूं। अब मैं PerformanceCounter का उपयोग करता हूं और 0 और 1 के बीच InstanceName को बदलता हूं, मेरे पास 2 कोर से डेटा होता है।2 कोर से अधिक के लिए सीपीयू उपयोग कैसे प्राप्त करें?

PerformanceCounter pc0 = new PerformanceCounter("Processor", "% Processor Time", "0"); 
PerformanceCounter pc1 = new PerformanceCounter("Processor", "% Processor Time", "1"); 

मैं तीसरे, चौथे कोर आदि के लिए मूल उपयोग कैसे प्राप्त कर सकता हूं?

क्या कोई मेरी मदद कर सकता है?

धन्यवाद

+5

क्या आपने 'नया प्रदर्शन काउंटर (" प्रोसेसर ","% प्रोसेसर टाइम "," 2 ") आज़माया;'? – Tokk

+0

यह भी देखें [SO: मैं प्रति कोर सीपीयू लोड कैसे प्राप्त कर सकता हूं] (http://stackoverflow.com/questions/2938629/how-can-i-get-cpu-load-per-core-in-c) –

उत्तर

5

मैंने पहले इस्तेमाल किया PerformanceCounter havent लेकिन वहाँ कुछ ऐसा करने के साथ गलत क्या है?

PerformanceCounter pc0 = new PerformanceCounter("Processor", "% Processor Time", "0"); 
PerformanceCounter pc1 = new PerformanceCounter("Processor", "% Processor Time", "1"); 
PerformanceCounter pc2 = new PerformanceCounter("Processor", "% Processor Time", "2"); 
PerformanceCounter pc3 = new PerformanceCounter("Processor", "% Processor Time", "3"); 
+1

ऐसा करने में समस्या यह है कि यदि कोर वास्तव में मौजूद नहीं हैं तो आपको एक त्रुटि मिलेगी। त्रुटि जैसे ही आप कोशिश करेंगे और काउंटर से मूल्य प्राप्त करेंगे (उदा। 'पीसी 4.RawValue')। हालांकि, अगर आपको पता है कि कम से कम 4 कोर हैं, तो आपका कोड ठीक होगा। –

+0

एएचएच पाठ्यक्रम: पी –

+0

बिल्कुल मैं मशीन पर 2 कोर के साथ ऐसा करने की कोशिश करता हूं और 'instanceName 2 मौजूद नहीं है' के बारे में त्रुटि मिली है, इसलिए मैंने सोचा कि यह काम नहीं करेगा। अब मैं कोशिश-पकड़ अपवाद का उपयोग करता हूं और दोनों वास्तुकला पर ठीक काम करता हूं। धन्यवाद – spychu

9

मुझे संदेह है कि आप वास्तव में क्या पूछ रहे हैं "How do I count the number of cores?" है। यह कोड कोर की संख्या को गिनता है, और उसके बाद प्रदर्शन काउंटर बनाते हैं।

 int coreCount = 0; 
     foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get()) 
     { 
      coreCount += int.Parse(item["NumberOfCores"].ToString()); 
     } 

     PerformanceCounter[] pc = new PerformanceCounter[coreCount]; 

     for (int i = 0; i < coreCount; i++) 
     { 
      pc[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString()); 
      Console.WriteLine(pc[i].CounterName); 
     } 
+0

अगर हमारे पास एचटीटी का समर्थन है और तार्किक प्रोसेसर उपयोग को पढ़ना चाहते हैं तो क्या होगा? – spychu

+0

अन्य स्टैक ओवरफ्लो प्रश्न (http://stackoverflow.com/questions/1542213/how-to-find-the-number-of-cpu-cores-via-net-c) पर स्वीकृत उत्तर देखें। यह उन सभी अलग-अलग चीजों पर विवरण देता है जिन्हें आप पढ़ना चाहते हैं। –

+0

मैंने इसे पहले पढ़ा है। मेरे पास तार्किक सीपीयू मात्रा आदि के बारे में डेटा है लेकिन मुझे लॉजिकल सीपीयू के प्रोसेसरटाइम को पढ़ने की जरूरत है। मुझे यकीन नहीं है कि मैं प्रदर्शनकॉन्टर – spychu

3

इस तरह कुछ बात भी आपकी आवश्यकता

public List<string> GetServerStatus() 
    { 
     List<string> cpuStatus = new List<string>(); 
     ObjectQuery wmicpus = new WqlObjectQuery("SELECT * FROM Win32_Processor"); 
     ManagementObjectSearcher cpus = new ManagementObjectSearcher(wmicpus); 
     try 
     { 
      int coreCount = 0; 
      int totusage = 0;    
      foreach (ManagementObject cpu in cpus.Get()) 
      { 
       //cpuStatus.Add(cpu["DeviceId"] + " = " + cpu["LoadPercentage"]); 
       coreCount += 1; 
       totusage += Convert.ToInt32(cpu["LoadPercentage"]); 
      } 
      if (coreCount > 1) 
      { 
       double ActUtiFloat = totusage/coreCount; 
       int ActUti = Convert.ToInt32(Math.Round(ActUtiFloat)); 
       //Utilisation = ActUti + "%"; 
       cpuStatus.Add("CPU = " + ActUti); 
      } 
      else 
      { 
       cpuStatus.Add("CPU = " + totusage); 
      } 



     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      cpus.Dispose(); 
     }    

     return cpuStatus; 
    } 
4

यह एक पुरानी सवाल हो सकता है के लिए काम करना चाहिए लेकिन किसी और एक अलग समाधान की तलाश के लिए, आप System.Environment क्यों उपयोग नहीं करते ?

public static List<System.Diagnostics.PerformanceCounter> GetPerformanceCounters() 
    { 
     List<System.Diagnostics.PerformanceCounter> performanceCounters = new List<System.Diagnostics.PerformanceCounter>(); 
     int procCount = System.Environment.ProcessorCount; 
     for (int i = 0; i < procCount; i++) 
     { 
      System.Diagnostics.PerformanceCounter pc = new System.Diagnostics.PerformanceCounter("Processor", "% Processor Time", i.ToString()); 
      performanceCounters.Add(pc); 
     } 
     return performanceCounters; 
    } 

संपादित करें: मैंने देखा है कि यह केवल तार्किक प्रोसेसर की मात्रा देता है, वास्तविक कोर गणना नहीं।

+0

कोर गिनती के बावजूद अभी भी एक अच्छा जवाब है। –

0
foreach (var item in new System.Management.ManagementObjectSearcher("Select NumberOfLogicalProcessors from Win32_Processor").Get()) 
       { 
        coreCount += int.Parse(item["NumberOfLogicalProcessors"].ToString()); 
       } 

       PerformanceCounter[] pc = new PerformanceCounter[coreCount]; 

       for (int i = 0; i < coreCount; i++) 
       { 
        pc[i] = new PerformanceCounter("Processor", "% Processor Time", i.ToString()); 

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