2012-08-01 38 views
5

क्या कोई जानता है कि मैं सी # में OpenHardwareMonitor.dll का उपयोग करने के लिए हाल के नमूने कहां पा सकता हूं। मैंने एक सरल कार्यान्वयन की कोशिश की है लेकिन सीपीयू टेम्पल नहीं मिल सकता है। मुझे पता है कि लाइब्रेरी में यह होना चाहिए क्योंकि ऐप को तापमान मिल जाता है।हालिया ओपनहार्डवेयर मॉनिटर नमूना कोड सी #

मुझे लगता है कि आपको कुछ चीजों पर रीडिंग प्राप्त करने के लिए ईवेंट पंजीकृत करना है, लेकिन मुझे एक अच्छा उदाहरण ढूंढना मुश्किल लगता है।

Computer myComputer = new Computer(); 

      myComputer.Open(); 

      foreach (var hardwareItem in myComputer.Hardware) 
      { 

       if (hardwareItem.HardwareType == HardwareType.CPU) 
       { 
        foreach (var sensor in hardwareItem.Sensors) 
        { 
         if (sensor.SensorType == SensorType.Temperature) 
         { 
          Console.WriteLine(sensor.Value); 
         } 
        } 
       } 

      } 

किसी भी विचार या अंतर्दृष्टि की सराहना की जाएगी।

उत्तर

8

नीचे तक मुझे मिला है। मेरे पास खर्च करने के लिए और अधिक समय नहीं है, इसलिए मैं आपको बाकी की सारी चीज़ें छोड़ दूंगा।

मुझे कोई भी दस्तावेज नहीं मिला। कोड में एक्सएमएल टिप्पणियां भी नहीं हैं, इसलिए मैंने जितनी दूर तक पहुंचने के लिए स्रोत कोड के माध्यम से खोला। आपको वही करना होगा।

पहली चीज़ जो आप खो रहे हैं वह है कि आपको पर कॉल करने से पहले Computer.CPUEnabled संपत्ति को सत्य पर सेट करना होगा। यह एक CPU हार्डवेयर डिवाइस जोड़ने के लिए खोलने का कारण बनता है।

दूसरी चीज़ जो आप खो रहे हैं वह है कि आपको Computer.Open पर कॉल करना होगा।

तीसरी चीज जो आप खो रहे हैं वह है कि आपको हार्डवेयर को फिर से मतदान करने के लिए Hardware.Update पर कॉल करना होगा।

चौथी चीज जो आप याद कर रहे हैं वह यह है कि सेंसर मान Nullable<float> है। आपको यह जांचना होगा कि वहां एक वैध मूल्य है।

यह अभी भी पर्याप्त नहीं है। हालांकि अब यह चार तापमान सेंसर (मेरी मशीन पर) आउटपुट करता है, फिर भी तापमान का मूल्य कभी नहीं होता है।

मैंने सेटिंग्स के माध्यम से खोद दिया और पाया कि सीपीयू और सीपीयू के तापमान के लिए इन लंबी प्रारंभिक वस्तुओं हैं। मैंने उन सेटिंग्स को Computer (कम से कम कोर के लिए) में रखने के लिए कोड जोड़ा, लेकिन इसका कोई प्रभाव नहीं पड़ा।

क्या विफल हो रहा है है यही कारण है कि मुझे लगता है कुछ आरंभीकरण गुम होती है IntelCpu.Update

Ring0.RdmsrTx(IA32_THERM_STATUS_MSR, out eax, out edx, 1UL << cpuid[i][0].Thread) 

में इस कॉल है।

शुभकामनाएं!

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Windows.Forms; 
using OpenHardwareMonitor.Hardware; 

namespace WindowsFormsApplication1 
{ 
    public class MySettings : ISettings 
    { 
     private IDictionary<string, string> settings = new Dictionary<string, string>(); 

     public MySettings(IDictionary<string, string> settings) 
     { 
      this.settings = settings; 
     } 

     public bool Contains(string name) 
     { 
      return settings.ContainsKey(name); 
     } 

     public string GetValue(string name, string value) 
     { 
      string result; 
      if (settings.TryGetValue(name, out result)) 
       return result; 
      else 
       return value; 
     } 

     public void Remove(string name) 
     { 
      settings.Remove(name); 
     } 

     public void SetValue(string name, string value) 
     { 
      settings[name] = value; 
     } 
    } 

    public class Form1 : Form 
    { 
     Computer myComputer; 
     Timer timer = new Timer { Enabled = true, Interval = 1000 }; 

     public Form1() 
     { 
      timer.Tick += new EventHandler(timer_Tick); 

      MySettings settings = new MySettings(new Dictionary<string, string> 
      { 
       { "/intelcpu/0/temperature/0/values", "H4sIAAAAAAAEAOy9B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iu6//MH37x79i9/+NX6N3/TJm9/5f/01fw1+fosnv+A/+OlfS37/jZ/s/Lpv9fff6Ml/NTef/yZPnozc5679b+i193//TQZ+/w2Dd+P9/sZeX/67v/GTf/b3iP3u4/ObBL//73+i+f039+D8Zk/+xz/e/P6beu2TQZju8yH8f6OgzcvPv/U3/Rb8+z/0f/9b/+yfaOn8079X6fr6Cws7ln/iHzNwflPv99/wyS/+xY4+v/evcJ+733+jJ5//Cw7/4ndy9Im3+U2e/Fbnrk31C93vrt/fyPvdb+N//hsF7/4/AQAA//9NLZZ8WAIAAA==" }, 
       { "/intelcpu/0/load/0/values", "H4sIAAAAAAAEAOy9B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iu6//MH37x79i9++mpwcv/md/9df89egZ/xX/ym/5y/4D37618Lv7ya//u+58+u+5d9/z7/5t/w9/6u5fP5bH/6av+eTkXyefXxp26ONaf/v/dG/sf39D/rvnv4e5vc/0IP56/waK/vuHzf5I38P8/tv+mv8Rbb9f0pwTF9/zr/1X9vP/8I//+/6Pf7Z30N+/zdf/HX29zd/859q4aCNP5b//U+U3/+7f+zXOjZwfqvDX/V7/o9/vPz+a1G/pv0f+fGlhfk7eZ//N3/0v28//5X0u/n8Cxq7+f1X/tHft20A5x8a/W5/02+BP36Nf+j/nv8XfzrT+c2//Ob4p3+vktvUhNs/+xcWikP6e/4T/5jS5M8/sL8vP/5ff49f/Ivl9//sHzv6PX/vXyG//9R/94/9HuZ34P/5vyC//3W/5e/1exa/k+Bw4bUBnU2bP4Xg/1bn0uafeTH6PatfKL//N3/0t2y/gG9+/8+IzqYNxmU+/+jwX7afY67/nwAAAP//GYSA31gCAAA=" }, 
      }); 

      myComputer = new Computer(settings) { CPUEnabled = true }; 
      myComputer.Open(); 
     } 

     void timer_Tick(object sender, EventArgs e) 
     { 
      Trace.WriteLine(""); 
      foreach (var hardwareItem in myComputer.Hardware) 
      { 
       if (hardwareItem.HardwareType == HardwareType.CPU) 
       { 
        hardwareItem.Update(); 
        foreach (IHardware subHardware in hardwareItem.SubHardware) 
         subHardware.Update(); 

        foreach (var sensor in hardwareItem.Sensors) 
        { 
         if (sensor.SensorType == SensorType.Temperature) 
         { 
          Trace.WriteLine(String.Format("{0} Temperature = {1}", sensor.Name, sensor.Value.HasValue ? sensor.Value.Value.ToString() : "no value")); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+1

आप प्रोग्रामर सर के लिए देवताओं का उपहार हैं ... –

+0

क्या आप विदेशी पुस्तकालय को समझने के बारे में कोई सुझाव देने के इच्छुक होंगे? कोई आसान तीसरे पक्ष के उपकरण? हालांकि आपके समय के लिए Thx, मुझे लगता है कि यह पोस्ट कई लोगों के लिए ब्याज की होगी। –

+1

@JoshElias बस स्रोत कोड पढ़ें, यह खुला स्रोत है: http://code.google.com/p/open-hardware-monitor/source/browse/#svn/trunk – Tergiver

5

पिछले जवाब के लिए टिप्पणी के रूप में इसे जोड़ने के लिए क्षमा नहीं, लेकिन मेरे पास पर्याप्त प्रतिष्ठा नहीं है।

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

ऐसा लगता है कि प्रशासनिक अधिकारों के बिना सीपीयू जानकारी प्राप्त करने के लिए निम्न स्तर की एपीआई कॉल की आवश्यकता नहीं है, लेकिन कोई त्रुटि प्रदर्शित नहीं होती है।