2009-07-28 17 views
47

मुझे विकसित होने वाले एप्लिकेशन के लिए कुछ सिस्टम की जानकारी इकट्ठा करने की आवश्यकता है। उपलब्ध स्मृति और सीपीयू लोड सी # का उपयोग करना आसान है। दुर्भाग्यवश, सीपीयू तापमान यह इतना आसान नहीं है। मैं WMI उपयोग करने की कोशिश की है, लेकिन मैं कुछ भीसीपीयू तापमान कैसे प्राप्त करें?

Win32_TemperatureProbe 

या

MSAcpi_ThermalZoneTemperature 

किसी को पहले से ही इस मुद्दे के साथ पेश किया गया है का उपयोग नहीं मिल सकता है? कैसे कार्यक्रमों की निगरानी, ​​SiSoftware सैंड्रा के रूप में मैं सोच रहा हूँ, कर सकते हैं कि जानकारी मिलती है ...

शायद ज़रुरत पड़े किसी को दिलचस्पी है, यहां वर्ग के कोड है:

public class SystemInformation 
{ 
    private System.Diagnostics.PerformanceCounter m_memoryCounter; 
    private System.Diagnostics.PerformanceCounter m_CPUCounter; 

    public SystemInformation() 
    { 
     m_memoryCounter = new System.Diagnostics.PerformanceCounter(); 
     m_memoryCounter.CategoryName = "Memory"; 
     m_memoryCounter.CounterName = "Available MBytes"; 

     m_CPUCounter = new System.Diagnostics.PerformanceCounter(); 
     m_CPUCounter.CategoryName = "Processor"; 
     m_CPUCounter.CounterName = "% Processor Time"; 
     m_CPUCounter.InstanceName = "_Total"; 
    } 

    public float GetAvailableMemory() 
    { 
     return m_memoryCounter.NextValue(); 
    } 

    public float GetCPULoad() 
    { 
     return m_CPUCounter.NextValue(); 
    } 

    public float GetCPUTemperature() 
    { 
     //... 
     return 0; 
    } 
} 
+0

अगर मैं याद सही ढंग से अपने ही पुस्तकालय है कि 'z-cpu 'उपयोग करता है .. – Peter

उत्तर

19

मैं बहुत यकीन है कि यह निर्माता निर्भर है, क्योंकि उन्हें एक आई/ओ बंदरगाह के माध्यम से पहुंचाया जाएगा। यदि आपके पास एक विशिष्ट बोर्ड है जिसके साथ आप काम करने का प्रयास कर रहे हैं, तो मैन्युअल और/या निर्माता से संपर्क करने का प्रयास करें।

यदि आप इसे कई अलग-अलग बोर्डों के लिए करना चाहते हैं, तो मैं किसी अन्य से SiSoftware जैसे किसी से संपर्क करने की सलाह दूंगा या बहुत सारे मदरबोर्ड मैनुअल पढ़ने के लिए तैयार रहूंगा।

एक और नोट के रूप में, सभी बोर्डों में तापमान मॉनीटर नहीं होते हैं।

आप कर्नेल से विशेषाधिकार प्राप्त पहुंच प्राप्त करने में भी समस्याएं पा सकते हैं।

3

कुछ सी # नमूना कोड के साथ एक ब्लॉग पोस्ट है, यह कैसे करें here

+1

यह अभी भी आवश्यक है कि विक्रेता का चालक इसे डब्लूएमआई के माध्यम से उजागर कर रहा हो। – ewanm89

30

मुझे पता है कि यह पोस्ट पुराना है, लेकिन अगर कोई इस पोस्ट को देख रहा है और इस समस्या का हल ढूंढने की कोशिश कर रहा है तो सिर्फ एक टिप्पणी जोड़ना चाहता था।

आप डब्लूएमआई दृष्टिकोण का उपयोग कर सी # में सीपीयू तापमान को आसानी से पढ़ सकते हैं।

सेल्सियस मान प्राप्त करने के लिए, मैंने एक रैपर बनाया है जो डब्लूएमआई द्वारा लौटाए गए मान को परिवर्तित करता है और इसे उपयोग करने में आसान ऑब्जेक्ट में लपेटता है।

कृपया विजुअल स्टूडियो में System.Management.dll का संदर्भ जोड़ने के लिए याद रखें।

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Management; 

namespace RCoding.Common.Diagnostics.SystemInfo 
{ 
    public class Temperature 
    { 
     public double CurrentValue { get; set; } 
     public string InstanceName { get; set; } 
     public static List<Temperature> Temperatures 
     { 
      get 
      { 
       List<Temperature> result = new List<Temperature>(); 
       ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature"); 
       foreach (ManagementObject obj in searcher.Get()) 
       { 
        Double temp = Convert.ToDouble(obj["CurrentTemperature"].ToString()); 
        temp = (temp - 2732)/10.0; 
        result.Add(new Temperature { CurrentValue = temp, InstanceName = obj["InstanceName"].ToString() }); 
       } 
       return result; 

      } 
     } 
    } 
} 

अद्यतन 25.06.2010:

(बस देखा कि एक लिंक वैसे भी ऊपर समाधान ... उसी तरह करने के लिए तैनात किया गया था, मैं कोड के इस टुकड़े छोड़ देंगे यदि किसी का उपयोग करना चाहते चाहिए यह :-))

+7

क्या आपने प्रश्न पढ़ा था? ओपी ने कहा कि वह पहले से ही MSAcpi_ThermalZoneTemperature कोशिश की है ... –

+0

यह सीपीयू तापमान नहीं है, मुझे लगता है कि इसका मामला तापमान है। आप CPUID का उपयोग कर जांच सकते हैं। – zezba9000

47

जो दूसरों यहाँ से आ सकता है के लिए, शायद पर एक नज़र डालें: http://openhardwaremonitor.org/

कि ली का पालन करें एनके और सबसे पहले आप सोच सकते हैं, "हे, यह एक एप्लीकेशन है, यही कारण है कि इसे हटा दिया गया था, सवाल यह था कि सी # कोड से ऐसा कैसे करें, एक ऐसा एप्लिकेशन न ढूंढें जो मुझे तापमान बता सके ..." यह वह जगह है यह दिखाता है कि आप "ओपन हार्डवेयर मॉनिटर" भी पढ़ने में पर्याप्त समय निवेश करने के इच्छुक नहीं हैं।

डेटा इंटरफेस ओपन हार्डवेयर मॉनिटर WMI (विंडोज प्रबंधन इंस्ट्रूमेंटेशन) के लिए सभी सेंसर डाटा प्रकाशित करता है:

वे भी एक डेटा इंटरफेस में शामिल हैं, यहाँ वर्णन है। यह अन्य अनुप्रयोगों को सेंसर जानकारी को पढ़ने और उपयोग करने की अनुमति देता है। इंटरफ़ेस का प्रारंभिक दस्तावेज here(click) पाया जा सकता है।

जब आप इसे डाउनलोड करते हैं, तो इसमें OpenHardwareMonitor.exe एप्लिकेशन होता है, आप उसे ढूंढ नहीं रहे हैं। इसमें OpenHardwareMonitorLib.dll भी शामिल है, आप उसे ढूंढ रहे हैं।

यह अधिकतर है, अगर 100% नहीं है, तो WinRing0 एपीआई के आस-पास एक रैपर है, जिसे आप अपने आप को लपेटने के लिए चुन सकते हैं।

मैंने इसे सी # एप से स्वयं से बाहर करने की कोशिश की है, और यह काम करता है। हालांकि यह अभी भी बीटा में है, लेकिन यह अपेक्षाकृत स्थिर लग रहा था। यह ओपन सोर्स भी है, इसलिए यह इसके बजाय एक अच्छा प्रारंभिक बिंदु हो सकता है।

दिन के अंत में मुझे विश्वास करना मुश्किल लगता है कि इस प्रश्न के विषय पर नहीं है।

+0

क्या आप OpenHardware Lib के उपयोग के बारे में किसी दस्तावेज़ को लिंक कर सकते हैं? मुझे लगता है कि मेरी परियोजना में इसका उपयोग कैसे किया जाए। – CJxD

+0

दुर्भाग्य से नहीं, मैंने जरूरी चीज़ों को ढूंढने के लिए सादे पुराने "खोज" का उपयोग किया ... लेकिन आपको क्या समस्याएं हैं? ... यह बहुत बुनियादी है कि यह "कंप्यूटर" कक्षा को तुरंत चालू कर रहा है और फिर वहां से काम करता है ... (उदाहरण के लिएकंप्यूटर -> IHardware -> ISensors) वैकल्पिक रूप से स्रोत को अपने एसवीएन भंडार से डाउनलोड करें और अपने स्वयं के जीयूआई को समझने का प्रयास करें, व्यक्तिगत रूप से मेरे पास चीजों को खोजने के लिए कोई समस्या नहीं थी, लेकिन यदि आपकी याद आ रही है तो यह कुछ विशिष्ट हो सकता है हो सकता है? – Jens

+0

और अपने जीयूआई को समझने के साथ, मेरा मतलब यह है कि आप विभिन्न विभिन्न सेंसर तक पहुंच कैसे प्राप्त करते हैं और इस पर प्रेरणा के स्रोत के रूप में ... और फिर उस उपयोग को अपनी परियोजना में दोहराएं। – Jens

1

यह आपके कोड में डब्लूएमआई के माध्यम से किया जा सकता है। मुझे माइक्रोसॉफ्ट से एक उपकरण मिला है जो इसके लिए कोड बनाता है।

WMI कोड प्रजापति उपकरण आपको VBScript, सी #, और वीबी इस तरह के प्रबंधन के लिए डेटा क्वेरी करने, एक WMI वर्ग से एक विधि को क्रियान्वित करने के रूप में एक प्रबंधन कार्य को पूरा करने WMI का उपयोग करता है नेट कोड, उत्पन्न करने के लिए अनुमति देता है या WMI का उपयोग कर ईवेंट नोटिफिकेशन प्राप्त करना।

आप इसे here डाउनलोड कर सकते हैं।

1

यह इस बात पर निर्भर करता है कि आपका कंप्यूटर WMI का समर्थन करता है या नहीं। मेरा कंप्यूटर भी इस डब्लूएमआई डेमो को नहीं चला सकता है।

लेकिन मुझे सफलतापूर्वक ओपन हार्डवेयर मॉनिटर के माध्यम से सीपीयू तापमान मिलता है। विजुअल स्टूडियो में ओपनहार्डवेयर मॉनिटर संदर्भ जोड़ें। ये तो और आसान है। इसे आजमाएं

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using OpenHardwareMonitor.Hardware; 
namespace Get_CPU_Temp5 
{ 
    class Program 
    { 
     public class UpdateVisitor : IVisitor 
     { 
      public void VisitComputer(IComputer computer) 
      { 
       computer.Traverse(this); 
      } 
      public void VisitHardware(IHardware hardware) 
      { 
       hardware.Update(); 
       foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this); 
      } 
      public void VisitSensor(ISensor sensor) { } 
      public void VisitParameter(IParameter parameter) { } 
     } 
     static void GetSystemInfo() 
     { 
      UpdateVisitor updateVisitor = new UpdateVisitor(); 
      Computer computer = new Computer(); 
      computer.Open(); 
      computer.CPUEnabled = true; 
      computer.Accept(updateVisitor); 
      for (int i = 0; i < computer.Hardware.Length; i++) 
      { 
       if (computer.Hardware[i].HardwareType == HardwareType.CPU) 
       { 
        for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++) 
        { 
         if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature) 
           Console.WriteLine(computer.Hardware[i].Sensors[j].Name + ":" + computer.Hardware[i].Sensors[j].Value.ToString() + "\r"); 
        } 
       } 
      } 
      computer.Close(); 
     } 
     static void Main(string[] args) 
     { 
      while (true) 
      { 
       GetSystemInfo(); 
      } 
     } 
    } 
} 

आपको इस डेमो को व्यवस्थापक के रूप में चलाने की आवश्यकता है।

आप ट्यूटोरियल यहाँ देख सकते हैं: आप http://www.cpuid-pro.com में लगेगा मैं भुगतान करने के लिए तैयार हैं, तो http://www.lattepanda.com/topic-f11t3004.html

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