programing tip

CPU 온도를 얻는 방법?

itbloger 2021. 1. 11. 07:44
반응형

CPU 온도를 얻는 방법?


개발중인 응용 프로그램에 대한 일부 시스템 정보를 수집해야합니다. 사용 가능한 메모리와 CPU로드는 C #을 사용하여 쉽게 얻을 수 있습니다. 불행히도 CPU 온도는 그렇게 쉽지 않습니다. 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;
    }
}

I / O 포트를 통해 액세스 할 수 있기 때문에 제조업체에 따라 다릅니다. 작업하려는 특정 보드가있는 경우 설명서를 살펴 보거나 제조업체에 문의하십시오.

여러 다른 보드에 대해이 작업을 수행하려면 SiSoftware와 같은 사람에게 연락하거나 많은 마더 보드 설명서를 읽을 준비를하는 것이 좋습니다.

참고로 모든 보드에 온도 모니터가있는 것은 아닙니다.

커널에서 권한있는 액세스를 얻는 데 문제가 발생할 수도 있습니다.


여기에 올 수있는 다른 사람들은 http://openhardwaremonitor.org/를 참조하십시오.

해당 링크를 따라 가면 처음에는 "응용 프로그램입니다. 그래서 제거 된 이유입니다. 문제는 온도를 알려줄 수있는 응용 프로그램을 찾는 것이 아니라 C # 코드에서이 작업을 수행하는 방법이었습니다."라고 생각할 수 있습니다. "오픈 하드웨어 모니터"가 무엇인지 읽는 데 충분한 시간을 투자 할 의향이 없음을 보여줍니다.

여기에는 데이터 인터페이스도 포함됩니다. 설명은 다음과 같습니다.

데이터 인터페이스 Open Hardware Monitor는 모든 센서 데이터를 WMI (Windows Management Instrumentation)에 게시합니다. 이를 통해 다른 응용 프로그램도 센서 정보를 읽고 사용할 수 있습니다. 인터페이스의 예비 문서는 여기 (클릭) 에서 찾을 수 있습니다 .

다운로드하면 OpenHardwareMonitor.exe 응용 프로그램이 포함되어 있으며 해당 응용 프로그램을 찾는 것이 아닙니다. 여기에는 OpenHardwareMonitorLib.dll도 포함되어 있습니다.

대부분 100 %는 아니지만 WinRing0 API를 둘러싼 래퍼 일 뿐이며, 원하는 경우 자신을 래핑하도록 선택할 수 있습니다.

나는 이것을 C # 앱에서 직접 시도했으며 작동합니다. 아직 베타 버전이지만 다소 안정적으로 보였습니다. 또한 오픈 소스이므로 대신 좋은 출발점이 될 수 있습니다.

결국 나는 그것이이 질문의 주제가 아니라는 것을 믿기 어렵다는 것을 알게됩니다.


이 게시물이 오래되었다는 것을 알고 있지만 누군가이 게시물을보고이 문제에 대한 해결책을 찾으려고해야하는 경우 댓글을 추가하고 싶었습니다.

실제로 WMI 접근 방식을 사용하면 C #에서 CPU 온도를 매우 쉽게 읽을 수 있습니다.

Celsius 값을 얻기 위해 WMI에서 반환 한 값을 변환하여 사용하기 쉬운 개체로 래핑하는 래퍼를 만들었습니다.

System.Management.dllVisual 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 :

(위와 같은 종류의 솔루션에 대한 링크가 게시 된 것을 보았습니다 ... 어쨌든 누군가가 그것을 사용하고 싶다면이 코드를 남겨 둘 것입니다 :-))


Open Hardware Monitor에서 CPU 부품을 분리 된 라이브러리로 추출하여 일반적으로 OHM에 숨겨진 센서와 멤버를 노출했습니다. 또한 OHM에서 2015 년 이후 풀 요청을 수락하지 않기 때문에 많은 업데이트 (Ryzen 및 Xeon 지원 등)가 포함됩니다.

https://www.nuget.org/packages/HardwareProviders.CPU.Standard/

의견을 들려주세요 :)


최신 프로세서에 대한 지원이 부족하더라도 Open Hardware Monitor를 사용할 수 있습니다.

internal sealed class CpuTemperatureReader : IDisposable
{
    private readonly Computer _computer;

    public CpuTemperatureReader()
    {
        _computer = new Computer { CPUEnabled = true };
        _computer.Open();
    }

    public IReadOnlyDictionary<string, float> GetTemperaturesInCelsius()
    {
        var coreAndTemperature = new Dictionary<string, float>();

        foreach (var hardware in _computer.Hardware)
        {
            hardware.Update(); //use hardware.Name to get CPU model
            foreach (var sensor in hardware.Sensors)
            {
                if (sensor.SensorType == SensorType.Temperature && sensor.Value.HasValue)
                    coreAndTemperature.Add(sensor.Name, sensor.Value.Value);
            }
        }

        return coreAndTemperature;
    }

    public void Dispose()
    {
        try
        {
            _computer.Close();
        }
        catch (Exception)
        {
            //ignore closing errors
        }
    }
}

공식 소스 에서 zip을 다운로드하고 프로젝트에서 OpenHardwareMonitorLib.dll에 대한 참조를 추출하여 추가합니다.


여기에이를 수행하는 방법에 대한 일부 C # 샘플 코드가 포함 된 블로그 게시물이 있습니다 .


컴퓨터 지원 여부에 따라 다릅니다 WMI. 내 컴퓨터에서도이 WMI 데모를 실행할 수 없습니다.

But I successfully get the CPU temperature via Open Hardware Monitor. Add the Openhardwaremonitor reference in Visual Studio. It's easier. Try this

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

You need to run this demo as administrator.

You can see the tutorial here: http://www.lattepanda.com/topic-f11t3004.html


It can be done in your code via WMI. I've found a tool from Microsoft that creates code for it.

The WMI Code Creator tool allows you to generate VBScript, C#, and VB .NET code that uses WMI to complete a management task such as querying for management data, executing a method from a WMI class, or receiving event notifications using WMI.

You can download it here.

ReferenceURL : https://stackoverflow.com/questions/1195112/how-to-get-cpu-temperature

반응형