2012-02-01 354 views
3

我想实时获取CPU性能数据,包括温度。我用下面的代码来获得CPU温度:MSAcpi_ThermalZoneTemperature类没有显示实际温度

try 
     { 
      ManagementObjectSearcher searcher = 
       new ManagementObjectSearcher("root\\WMI", 
       "SELECT * FROM MSAcpi_ThermalZoneTemperature"); 

      foreach (ManagementObject queryObj in searcher.Get()) 
      { 
       double temp = Convert.ToDouble(queryObj["CurrentTemperature"].ToString()); 
       double temp_critical = Convert.ToDouble(queryObj["CriticalTripPoint"].ToString()); 
       double temp_cel = (temp/10 - 273.15); 
       double temp_critical_cel = temp_critical/10 - 273.15; 
       lblCurrentTemp.Text = temp_cel.ToString(); 
       lblCriticalTemp.Text = temp_critical_cel.ToString(); 
      } 
     } 
     catch (ManagementException e) 
     { 
      MessageBox.Show("An error occurred while querying for WMI data: " + e.Message); 
     } 

但这段代码显示的温度不是正确的温度。它通常显示49.5-50.5摄氏度。但我使用了“OpenHardwareMonitor”,它报告CPU温度超过71摄氏度,并随着时间分数改变分数。有什么我在代码中缺少的?

我在timer_click事件中使用了上述代码,每隔500毫秒间隔刷新一次温度读数,但始终显示执行开始时的温度。这意味着如果你运行这个应用程序,并且它显示49度,然后1小时的会话,它会不断显示49度。哪里有问题?

+0

'queryObj [“ThermalStamp”]'的值是否在调用之间改变? – 2012-02-01 18:42:36

+0

@FrédéricHamidi - 我检查了ThermalStamp属性,它在通话中获得了8个值,但从来不会在通话间发生变化... – jchoudhury 2012-02-01 18:58:05

+0

奇怪。你确定你的计时器会在你认为它的时候滴答滴答,并且你的代码在每个滴答时间被调用吗? – 2012-02-01 19:01:35

回答

2

http://www.scriptinternals.com/new/us/support/Internal/WMI_MSAcpi_ThermalZoneTemperature.htm我发现CurrentTemperature返回温度在某个位于主板某处的散热区域。这意味着它不会返回CPU温度。 这将是相同的温度在厨房是30C,但灶是200C左右...... 这种方式不能显示CPU的确切温度。要获得CPU(以及每个核心)的确切温度,需要编写内核驱动程序,但要复杂得多。

总而言之,您的代码确实应该做,因为需要使用其他方式来获取温度。

+0

是的,你是对的。谢谢回复。我后来发现,使用微软的WMI类无法确定CPU温度。 – jchoudhury 2013-06-25 07:28:32

+0

@jchoudhury想问一下,你找到了一些简单的方法来获得温度? – ST3 2013-07-06 20:21:12

+0

我还没找到它。如果您有比WMI更好的解决方案,请与我分享。感谢您的询问。 – jchoudhury 2013-08-16 02:27:14