C# CPU и GPU Temp
Я нахожусь в процессе создания программы персонального мониторинга производительности системы, и у меня возникают проблемы с выяснением того, как C# получает информацию о температуре процессора и графического процессора.
У меня уже есть программа, которая извлекает информацию о загрузке и частоте процессора (а также о многих других вещах) через PerformanceCounter, но мне не удалось найти переменные Instance, Object и Counter для температуры процессора.
Кроме того, мне нужно иметь возможность получать температуру более одного графического процессора, так как у меня есть два.
Что я делаю?
4 ответа
Вы можете использовать WMI для этого, есть генератор кода AC# для WMI, который очень помогает при создании запросов WMI, поскольку он не очень хорошо документирован.
Генератор кода WMI можно найти здесь: http://www.microsoft.com/en-us/download/details.aspx?id=8572
быстрая попытка генерирует что-то вроде этого:
public static void Main()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\WMI",
"SELECT * FROM MSAcpi_ThermalZoneTemperature");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------");
Console.WriteLine("MSAcpi_ThermalZoneTemperature instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("CurrentTemperature: {0}", queryObj["CurrentTemperature"]);
}
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
}
Это может быть не совсем то, что вам нужно, просто попробуйте с доступными свойствами и классами
// Gets temperature info from OS and prints it to the console
PerformanceCounter perfCount = new PerformanceCounter("Processor", "% Processor Time", "_Total");
PerformanceCounter tempCount = new PerformanceCounter("Thermal Zone Information", "Temperature", @"\_TZ.THRM");
while (true)
{
Console.WriteLine("Processor time: " + perfCount.NextValue() + "%");
// -273.15 is the conversion from degrees Kelvin to degrees Celsius
Console.WriteLine("Temperature: {0} \u00B0C", (tempCount.NextValue() - 273.15f));
Thread.Sleep(1000);
}
Вы можете получить температуру процессора как WMI, так и Openhardwaremonitor.
Открыть Hardwaremonitor:
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();
}
}
}
}
WMI:
using System;
using System.Diagnostics;
using System.Management;
class Program
{
static void Main(string[] args)
{
Double CPUtprt = 0;
System.Management.ManagementObjectSearcher mos = new System.Management.ManagementObjectSearcher(@"root\WMI", "Select * From MSAcpi_ThermalZoneTemperature");
foreach (System.Management.ManagementObject mo in mos.Get())
{
CPUtprt = Convert.ToDouble(Convert.ToDouble(mo.GetPropertyValue("CurrentTemperature").ToString()) - 2732) / 10;
Console.WriteLine("CPU temp : " + CPUtprt.ToString() + " °C");
}
}
}
Я нашел хороший учебник здесь, я получаю темп процессора успешно.