2013-09-26 5 views
5

ho fatto riferimento il mio progetto con OpenHardwareMonitor.dll E poi creato nuova classe con questo codice:Come ottengo la velocità della ventola della cpu usando la libreria 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; 
     } 

Sulla linea:

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

Se sto usando la temperatura che sta funzionando bene e mostrando la temperatura. Ma una volta che lo cambio in Fan il SensorType mai == al Fan

E se sto eseguendo il programma openhardwaremonitor originale mostra tutte le cose anche la velocità della ventola della CPU.

Quindi perché nel mio codice non funziona?

EDIT **

dimenticato di dire che nel Form1 in cima ho:

private CpuTemperature cpu; 

Poi nel costruttore:

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

Forse ci dovrebbe essere qualcosa di simile per la FAN della CPU ma non sono riuscita a trovarne. Quindi mi chiedo come lo usano nel monitore openhwardware originale.

provato a cercare nel codice sorgente: http://open-hardware-monitor.googlecode.com/svn/trunk/GUI/

Ma non ho trovato come ottenere la velocità delle ventole CPU/GPU.

+0

modificato la mia domanda. – user2760148

risposta

1

Sembra che è necessario quanto segue per accendere il lettore di ventilatore:

computer.FanControllerEnabled = true; 
+0

Non è effettivamente per controllare (cambiare) la velocità della ventola? –

+0

@ BenVoigt Non è solo per questo. Vedi OP '. GPUEnabled = true;' e 'CPUEnabled = true;' che sono la stessa convenzione di denominazione. Sembra che stia leggendo sensori e controllando - nessuna distinzione fatta tra i due. Nota comunque le mie parole di apertura non definitive. – bland

+0

Uggh. Bene, questo è metà del suo problema. L'altra metà è correlata. –

0

Stai solo alla ricerca di sensori annidati all'interno dell'oggetto della CPU.

In realtà ci sono sensori di temperatura all'interno della CPU, ma le ventole non sono né all'interno della CPU né collegate ad essa. Il tuo "ventaglio CPU" è chiamato così perché è posizionato fisicamente sulla CPU per raffreddarlo.

Cercare i sensori del ventilatore in un altro punto dell'albero. Sul mio sistema vengono visualizzati all'interno dell'oggetto della scheda madre. Troverai anche misurazioni aggiuntive della temperatura della CPU, da sensori posizionati all'esterno del modulo CPU. Anche la tensione della CPU viene rilevata al di fuori della CPU, almeno sul mio sistema, quindi nidificata all'interno della scheda madre e non nella CPU nella struttura di monitoraggio hardware.

Come noto, il myComputer.CPUEnabled = true; potrebbe non essere sufficiente per abilitare il resto dell'albero del sensore.

2

Per chiunque ancora alle prese con questo, è innanzitutto necessario abilitare la scheda madre in oggetto OpenHardwareMonitor.Hardware.Computer:

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

Devi quindi cercare strati profondi hardware.
Con questo voglio dire:

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

E 'molto importante che si ha la subhardware.update(); chiama lì, altrimenti vedrai solo i sensori del tipo di controllo (lo so per esperienza dolorosa).

Spero che questo aiuti.

Riferimenti:
SuperIO
Mainboard

+1

Il numero della ventola non significa necessariamente che sia la ventola della CPU. Una buona pratica sarebbe avere un file di configurazione che indica quale numero è ciò che sulla scheda madre. –

Problemi correlati