2013-09-26 12 views
5

I odwołuje mojego projektu z OpenHardwareMonitor.dll A potem stworzył nową klasę z tym kodem:Jak uzyskać prędkość wentylatora procesora za pomocą biblioteki OpenHardwareMonitor?

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; 
     } 

rozmówcy:

if (sensor.SensorType == SensorType.Fan)//Temperature) 

Jeśli używam Temperatura to działa dobrze i pokazując Temperatura. Ale raz zmieniam go na Fan the SensorType never == na Fan

I jeśli mam uruchomiony oryginalny program openhardwaremonitor, pokazuje on wszystko, nawet prędkość wentylatora procesora.

Dlaczego w moim kodzie nie działa?

EDIT **

Zapomniałem wspomnieć, że w Form1 na górze mam:

private CpuTemperature cpu; 

Następnie w konstruktorze:

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=" }, 
      }); 

Może nie powinno być coś podobnego do tego Wentylator procesora, ale nie mogłem go znaleźć. Więc zastanawiam się, jak go używać w oryginalnym monitorze openhwardware.

Próbowałem szukać w kodzie źródłowym: http://open-hardware-monitor.googlecode.com/svn/trunk/GUI/

Ale ja nie znaleźliśmy sposobu, aby uzyskać prędkość wentylatorów CPU/GPU.

+0

Pod moje pytanie. – user2760148

Odpowiedz

1

Wygląda na to potrzebne są następujące elementy, aby włączyć czytnik wentylatora:

computer.FanControllerEnabled = true; 
+0

Czy to nie dotyczy rzeczywistej kontroli (zmiany) prędkości wentylatora? –

+0

@BenVoigt Nie jest to wyłącznie dla niego. Zobacz OP '.GPUEnabled = true;' i 'CPUEnabled = true;', które są zgodne z tą samą konwencją nazewnictwa. Pojawia się, że odczytuje czujniki i kontroluje - nie rozróżnia się między nimi. Zauważ jednak moje nieokreślone słowa otwierające. – bland

+0

Uggh. Cóż, to połowa jego problemu. Druga połowa jest powiązana. –

0

jesteś tylko szukasz czujników zagnieżdżone wewnątrz obiektu procesora.

Wewnątrz CPU znajdują się czujniki temperatury, ale wentylatory nie są ani wewnątrz procesora, ani podłączone do niego. Twój "wentylator procesora" nazywa się tym, ponieważ jest fizycznie umieszczony na szczycie procesora, aby go ochłodzić.

Wyszukaj czujniki wentylatora w innym miejscu drzewa. W moim systemie są wyświetlane w obiekcie płyty głównej. Znajdziesz tam również dodatkowe pomiary temperatury procesora, z czujników umieszczonych na zewnątrz modułu CPU. Napięcie procesora również jest wykrywane na zewnątrz procesora, przynajmniej w moim systemie, a tym samym zagnieżdżone w płycie głównej, a nie procesor w drzewie monitorowania sprzętu.

Jak nietrudno zauważyć, myComputer.CPUEnabled = true; może nie wystarczyć do włączenia reszty drzewa czujników.

2

Dla każdego nadal zmaga się z tym, trzeba najpierw włączyć płytę główną w swoim obiekcie OpenHardwareMonitor.Hardware.Computer:

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

wtedy trzeba szukać warstw sprzętowych głębokie.
Rozumiem przez to:

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"); 
       } 
      } 
     } 
    } 
} 

Jest to bardzo ważne, że masz subhardware.update(); zadzwoń tam, w przeciwnym razie zobaczysz tylko czujniki typu kontrolnego (wiem z bolesnego doświadczenia).

Mam nadzieję, że to pomoże.

Referencje:
SuperIO
Mainboard

+1

Numer wentylatora niekoniecznie oznacza, że ​​jest to wentylator procesora. Dobrą praktyką byłoby posiadanie pliku konfiguracyjnego, który mówi, jaki numer znajduje się na płycie głównej. –

Powiązane problemy