2013-09-26 7 views
5

Ben OpenHardwareMonitor.dll ile projemi başvurulan Ve sonra bu kod ile yeni sınıf yarattı: satırdaOpenHardwareMonitor lib programını kullanarak cpu fan hızını nasıl alabilirim? ben iyi çalışıyor ve gösteriyor Sıcaklık kullanıyorum varsa</p> <pre><code>if (sensor.SensorType == SensorType.Fan)//Temperature) </code></pre> <p>:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using OpenHardwareMonitor.Hardware; 
using System.Diagnostics; 
using DannyGeneral; 
using System.Windows.Forms; 
using System.Threading; 

namespace HardwareMonitoring 
{ 
    class Core 
    { 
     public static Form1 form1; 

     private static List<float?> cpuSensorValues = new List<float?>(); 
     private static List<float?> gpuSensorValues = new List<float?>(); 
     Computer myComputer; 
     Computer computer; 

     public Core(Form1 f) 
     { 
      form1 = f; 
      myComputer = new Computer(); 
      myComputer.CPUEnabled = true; 
      myComputer.Open(); 
      computer = new Computer(); 
      computer.Open(); 
      computer.GPUEnabled = true; 
     } 

     public float? cpuView(bool pause , CpuTemperature cpuTemp , Form1 f1 , List<string> myData , float? myCpuTemp , Button b1) 
     { 
      try 
      { 
       if (pause == true) 
       { 
       } 
       else 
       { 
        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) 
          { 
           cpuTemp.SetValue("sensor", sensor.Value.ToString()); 
           if (sensor.SensorType == SensorType.Fan)//Temperature) 
           { 
            sensor.Hardware.Update(); 
            cpuTemp.GetValue("sensor", sensor.Value.ToString()); 
            if (!f1.IsDisposed) 
            { 
             Thread.Sleep(1000); 
             f1.Invoke(new Action(() => myData.Add("Cpu Temeprature --- " + sensor.Value.ToString()))); 
            } 
            myCpuTemp = sensor.Value; 
            //if (sensor.Value > 60) 
            //{ 
             cpuSensorValues.Add(sensor.Value); 
             if (cpuSensorValues.Count == 300) 
             { 
              float a = ComputeStats(cpuSensorValues).Item1; 
              float b = ComputeStats(cpuSensorValues).Item2; 
              float c = ComputeStats(cpuSensorValues).Item3; 
              Logger.Write("********************************"); 
              Logger.Write("CPU Minimum Temperature Is ===> " + a); 
              Logger.Write("CPU Maximum Temperature Is ===> " + b); 
              Logger.Write("CPU Average Temperature Is ===> " + c); 
              Logger.Write("********************************" + Environment.NewLine);            
              cpuSensorValues = new List<float?>(); 
             } 
             b1.Enabled = true; 
            //} 
            break; 
           } 
          } 
         } 
        } 
       } 
      } 
      catch(Exception err) 
      { 
       Logger.Write("There was an exception: " + err.ToString()); 
      } 
      return myCpuTemp; 
     } 

sıcaklık. Ama bir kez Fan için değiştiririm FanTM

FanT ve hiçbir zaman, orijinal openhardwaremonitor programı çalıştırıyorsam, cpu fan hızı bile tüm öğeleri gösteriyor.

Neden kodumda çalışmıyor?

üstündeki Form1'da belirtmeyi unuttum ** DÜZENLEME i var:

cpu = new CpuTemperature(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=" }, 
      }); 

Belki daha böyle bir şey olmalı: yapıcı Sonra

private CpuTemperature cpu; 

CPU'nun FAN'ı ama bulamadım. Bu yüzden orijinal openhwardwaremonitor'da nasıl kullandıklarını merak ediyorum.

kaynak kodunda arama yapmak için çalıştı: http://open-hardware-monitor.googlecode.com/svn/trunk/GUI/

Ama cpu/gpu fanlar hız nasıl bulamadık. Yalnızca CPU nesnesinin içinde yuvalanmış sensörler için aradığınız

computer.FanControllerEnabled = true; 
+0

sorumu Düzenlendi. – user2760148

cevap

1

görünüyor.

Aslında CPU'nun içinde sıcaklık sensörleri var, ancak fanlar ne CPU'nun içinde ne de ona bağlı. "CPU fan'ınız", CPU'yu soğutmak için fiziksel olarak yerleştirildiği için denir.

Ağacın başka bir yerinde Fan sensörlerine bakın. Sistemimde anakart nesnesi içinde görüntülenirler. CPU modülünün dışına yerleştirilmiş sensörlerden de CPU sıcaklıklarının ek ölçümlerini bulacaksınız. CPU voltajı da en azından sistemimde CPU'nun dışında algılanır ve bu nedenle donanım izleme ağacındaki CPU değil anakartta yuvalanır. Belirtildiği gibi, sensör ağacının geri kalanını etkinleştirmek için myComputer.CPUEnabled = true; yeterli olmayabilir. herkes için hala bununla mücadele

+0

Bu gerçekten fan hızlarını kontrol etmek (değiştirmek) için değil mi? –

+0

@BenVoigt Sadece bunun için değil. Aynı adlandırma kuralı olan OP'nin '.GPUEnabled = true;' ve 'CPUEnabled = true; Algılayıcıları okuduğunu ve kontrol ettiklerini görüyor - ikisi arasında bir ayrım yapılmıyor. Kesin olmayan açılış sözcüklerimi not et. – bland

+0

Uggh. Şey, bu onun probleminin yarısı. Diğer yarısı ilgili. –

0

: Eğer fan okuyucuya açmak için aşağıdaki gerekiyor gibi

2

, öncelikle OpenHardwareMonitor.Hardware.Computer nesnesinde anakart etkinleştirmek zorunda:

Computer computerHardware = new Computer(); 
computerHardware.MainboardEnabled = true; 

Ardından derin donanım katmanları aramak zorunda.Bununla
Yani:

foreach (var hardware in computerHardware.Hardware) 
{ 
    // This will be in the mainboard 
    foreach (var subhardware in hardware.SubHardware) 
    { 
     // This will be in the SuperIO 
     subhardware.Update(); 
     if (subhardware.Sensors.Length > 0) // Index out of bounds check 
     { 
      foreach (var sensor in subhardware.Sensors) 
      { 
       // Look for the main fan sensor 
       if (sensor.SensorType == SensorType.Fan && sensor.Name.Equals("Fan #1", StringComparison.OrdinalIgnoreCase)) 
       { 
        Console.WriteLine("CPU Fan Speed:" + Convert.ToString((int)(float)sensor.Value) + " RPM"); 
       } 
      } 
     } 
    } 
} 

Size subhardware.update olması çok önemlidir(); Orada arama yapın, aksi takdirde sadece kontrol tipi sensörleri göreceksiniz (acı verici deneyimlerden biliyorum).

Umarım bu yardımcı olur.

Referanslar:
SuperIO
Mainboard

+1

Fan numarası, mutlaka CPU fanı olduğu anlamına gelmez. İyi bir uygulama, anakartta ne sayı olduğunu söyleyen bir yapılandırma dosyasına sahip olmaktır. –

İlgili konular