Подтвердить что ты не робот

Как получить температуру процессора?

Мне нужно собрать некоторую системную информацию для приложения, которое я разрабатываю. Доступную память и загрузку процессора легко получить с помощью С#. К сожалению, температура процессора не так-то просто. Я пробовал использовать 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;
    }
}
4b9b3361

Ответ 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.

Вы можете скачать здесь.