Как получить температуру процессора?
Мне нужно собрать некоторую системную информацию для приложения, которое я разрабатываю. Доступную память и загрузку процессора легко получить с помощью С#. К сожалению, температура процессора не так-то просто. Я пробовал использовать WMI, но я ничего не мог использовать с помощью
Win32_TemperatureProbe
или
MSAcpi_ThermalZoneTemperature
Кто-нибудь уже справился с этой проблемой? Мне интересно, как программы мониторинга, как SiSoftware Sandra, могут получить эту информацию...
На всякий случай кого-нибудь интересует, вот код класса:
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;
}
}
Ответы
Ответ 1
Я уверен, что это зависит от производителя, поскольку они будут доступны через порт ввода-вывода. Если у вас есть конкретная плата, с которой вы пытаетесь работать, попробуйте просмотреть руководства и/или связаться с производителем.
Если вы хотите сделать это для множества разных плат, я бы рекомендовал связаться с кем-то на что-то вроде SiSoftware или быть готовым прочитать много руководства по материнской плате.
В качестве еще одной заметки не все платы имеют температурные мониторы.
Вы также можете столкнуться с проблемами получения привилегированного доступа из ядра.
Ответ 2
Для других, кто может приехать сюда, возможно, взгляните на: http://openhardwaremonitor.org/
Следуйте этой ссылке, и сначала вы можете подумать: "Эй, это приложение, поэтому оно было удалено, вопрос состоял в том, как это сделать с кодом С#, а не для поиска приложения, которое может сказать мне температуру.." Это показывает, что вы не хотите вкладывать достаточно времени в чтение "Open Hardware Monitor".
Они также включают интерфейс данных, вот описание:
Интерфейс данныхOpen Hardware Monitor публикует все данные датчиков для WMI (Инструмент управления Windows). Это позволяет другим приложений для чтения и использования информации о датчике. предварительную документацию по интерфейсу можно найти здесь (щелкните).
Когда вы загружаете его, он содержит приложение OpenHardwareMonitor.exe, вы его не ищете. Он также содержит файл OpenHardwareMonitorLib.dll, который вы ищете.
В основном, если не 100%, это всего лишь обертка вокруг API WinRing0, которую вы можете выбрать, чтобы обернуть себя, если вам так хочется.
Я сам пробовал это из приложения С#, и он работает. Хотя он все еще находится в состоянии бета-тестирования, он выглядит довольно стабильным. Он также является открытым исходным кодом, поэтому он может быть хорошей отправной точкой.
В конце дня мне трудно поверить, что это не вопрос по этому вопросу.
Ответ 3
Я знаю, что этот пост старый, но просто хотел добавить комментарий, если кто-то должен смотреть на это сообщение и пытаться найти решение этой проблемы.
Вы действительно можете легко прочитать температуру процессора в С#, используя подход WMI.
Чтобы получить значение Цельсия, я создал оболочку, которая преобразует значение, возвращаемое WMI, и переносит его в простой в использовании объект.
Не забудьте добавить ссылку на System.Management.dll
в 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;
}
}
}
}
Обновление 25.06.2010:
(Просто увидел, что ссылка была отправлена на одно и то же решение выше...
Во всяком случае, я оставлю эту часть кода, если кто-то захочет ее использовать:-))
Ответ 4
Существует сообщение в блоге с некоторым примером кода С# о том, как это сделать здесь.
Ответ 5
Это можно сделать в коде через WMI. Я нашел инструмент от Microsoft, который создает для него код.
Средство создания кода WMI позволяет создавать VBScript, С# и VB.NET-код, который использует WMI для выполнения задачи управления, такой как запрос для данных управления, выполнения метода из класса WMI или получения уведомления о событиях с использованием WMI.
Вы можете скачать здесь.