2009-07-28 14 views
47

Ho bisogno di raccogliere alcune informazioni di sistema per l'applicazione che sto sviluppando. La memoria disponibile e il carico della CPU sono facili da ottenere usando C#. Sfortunatamente, la temperatura della CPU non è così facile. Ho provato con WMI, ma non ho potuto ottenere qualsiasi cosa utilizzandoCome ottenere la temperatura della CPU?

Win32_TemperatureProbe 

o

MSAcpi_ThermalZoneTemperature 

Qualcuno ha già affrontato questo problema? Mi chiedo come programmi di monitoraggio, come SiSoftware Sandra, posso ottenere che le informazioni ...

Solo nel caso qualcuno fosse interessato, ecco il codice della classe:

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

Se siete disposti a pagare Vorrei guardare in http://www.cpuid-pro.com se non ricordo male la sua stessa libreria che 'z-cpu 'usa .. – Peter

risposta

19

Sono abbastanza sicuro dipende dal produttore, dal momento che sarà accessibile tramite una porta I/O. Se hai una scheda specifica con cui stai lavorando, prova a consultare i manuali e/oa contattare il produttore.

Se si desidera fare questo per un sacco di diverse schede, mi consiglia di contattare qualcuno in qualcosa come SiSoftware o essere pronti a leggere un sacco di manuali della scheda madre.

Come un'altra nota, non tutte le schede dispongono di monitor di temperatura.

Si possono inoltre incontrare problemi con l'accesso privilegiato dal kernel.

3

C'è un post sul blog con un codice di esempio C# su come farlo here.

+1

Ciò richiede ancora che il driver del venditore lo esponga tramite WMI. – ewanm89

30

So che questo post è vecchio, ma volevo semplicemente aggiungere un commento se qualcuno dovesse guardare questo post e provare a trovare una soluzione per questo problema.

Si può effettivamente leggere la temperatura della CPU molto facilmente in C# utilizzando un approccio WMI.

Per ottenere un valore Celsius, ho creato un wrapper che converte il valore restituito da WMI e lo avvolge in un oggetto facile da usare.

Ricordare di aggiungere un riferimento allo System.Management.dll in Visual Studio.

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; 

      } 
     } 
    } 
} 

Aggiornamento 25.06.2010:

(Appena visto che un link è stato inviato alle lo stesso tipo di soluzione di cui sopra ... Comunque, lascerò questo pezzo di codice, se qualcuno dovrebbe voler usare esso :-))

+7

Hai letto la domanda? L'OP ha detto che ha già provato MSAcpi_ThermalZoneTemperature ... –

+0

Questa non è la temperatura della CPU, penso che sia la sua temperatura. Puoi controllare usando CPUID. – zezba9000

47

Per gli altri che possono venire da qui, forse dare un'occhiata a: http://openhardwaremonitor.org/

Seguire che li e all'inizio potreste pensare, "hey è un'applicazione, è per questo che è stata rimossa, la domanda era come farlo dal codice C#, non per trovare un'applicazione che possa dirmi la temperatura ..." Questo è dove mostra che non sei disposto a investire abbastanza tempo nella lettura di ciò che è anche "Open Hardware Monitor".

Esse comprendono anche un'interfaccia dati, ecco la descrizione:

Interfaccia dati Il monitor Open Hardware pubblica tutti i dati dei sensori per WMI (Windows Management Instrumentation). Ciò consente ad altre applicazioni di leggere e utilizzare anche le informazioni del sensore. Una documentazione preliminare dell'interfaccia può essere trovata here(click).

Quando lo scarichi, contiene l'applicazione OpenHardwareMonitor.exe, non stai cercando quella. Contiene anche OpenHardwareMonitorLib.dll, lo stai cercando.

È principalmente, se non al 100%, solo un wrapper attorno all'API WinRing0, che è possibile scegliere di avvolgere se necessario.

Ho provato da solo un'applicazione C# e funziona. Anche se è ancora in beta, è sembrato piuttosto stabile. È anche open source, quindi potrebbe essere un buon punto di partenza.

Alla fine della giornata trovo difficile credere che non sia in tema di questa domanda.

+0

È possibile collegare qualsiasi documentazione sull'utilizzo di OpenHardware Lib? Non riesco a scoprire come usare questo nel mio progetto. – CJxD

+0

Sfortunatamente no, ho usato la semplice "scoperta" per trovare le cose di cui avevo bisogno ... Ma con che problemi hai? ... Al momento è molto semplice creare un'istanza della classe "Computer" e poi continuare a lavorare da lì ... (per esempioComputer -> IHardware -> ISensors) In alternativa, scarica la sorgente dal loro repository SVN e cerca di capire la loro GUI, personalmente non ho avuto un grosso problema per scoprire solo le cose, ma se ti manca qualcosa di specifico potrebbe essere? – Jens

+0

E con la comprensione della loro interfaccia grafica, intendo come fonte di ispirazione per come ottenere l'accesso ai vari sensori e così via ... E quindi replicare tale utilizzo nel proprio progetto. – Jens

1

Può essere eseguito nel codice tramite WMI. Ho trovato uno strumento di Microsoft che crea codice per questo.

Lo strumento WMI Code Creator permette di generare VBScript, C# e VB codice .NET che utilizza WMI per completare un compito di gestione come l'interrogazione per i dati di gestione, l'esecuzione di un metodo da una classe WMI, o ricevere notifiche di eventi tramite WMI.

È possibile scaricarlo here.

1

Dipende se il computer supporta WMI. Il mio computer non può eseguire anche questa demo WMI.

Ma ottengo correttamente la temperatura della CPU tramite Open Hardware Monitor. Aggiungi il riferimento Openhardwaremonitor in Visual Studio. È più facile. Prova questo

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

È necessario eseguire questa demo come amministratore.

Potete vedere il tutorial qui: http://www.lattepanda.com/topic-f11t3004.html

Problemi correlati