首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VB 從 WMI 獲取 CPU 溫度數值不更新:WMI 資料刷新機制說明

     編輯:程式設計綜合問答

現象

VB 程式碼查詢 MSAcpi_ThermalZoneTemperature 取得 CPU 溫度,但數值靜態不變;打開 SpeedFan 後 WMI 數值卻會動態更新。

原因分析

  • WMI 溫度資料由 **ACPI 驅動程式** 定期更新,預設輪詢間隔可能較長(數秒到數分鐘),視硬體廠商實作而定。
  • SpeedFan 等監控軟體會**主動輪詢**或註冊 WMI 事件通知,導致驅動程式更頻繁更新快取。
  • 單次查詢 ExecQuery 只讀取當前快取值,不會觸發硬體感測器即時採樣。

解決方案

1. 定時器輪詢(簡易)

Private Sub Timer1_Timer()
    Label1.Caption = "CPU 溫度: " & GetCPUTemperature() & " °C"
End Sub

Function GetCPUTemperature() As Double
    Dim objWMI, colItems, objItem
    Set objWMI = GetObject("winmgmts:\\.\root\WMI")
    Set colItems = objWMI.ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature")
    For Each objItem In colItems
        GetCPUTemperature = (objItem.CurrentTemperature - 2732) / 10 ' 轉攝氏
    Next
End Function

設定 Timer Interval 為 1000~5000ms 視需求調整。

2. WMI 事件通知(進階,需驅動支援)

' 需確認硬體支援 __InstanceModificationEvent
Set objEventSource = GetObject("winmgmts:\\.\root\WMI")
Set objEvent = objEventSource.ExecNotificationQuery( _
    "SELECT * FROM __InstanceModificationEvent WITHIN 2 WHERE TargetInstance ISA 'MSAcpi_ThermalZoneTemperature'")
Do
    Set objItem = objEvent.NextEvent
    ' 處理 objItem.TargetInstance.CurrentTemperature
Loop

注意

  • 並非所有主機板/BIOS 都支援 MSAcpi_ThermalZoneTemperature,部分需改用 Win32_TemperatureProbe 或廠商專屬 WMI 命名空間。
  • 溫度單位為 **十分之一開爾文**(0.1 K),轉換公式:(Kelvin - 2731.5) / 10 = °C。
  • 若需更精準、低延遲,建議改用 OpenHardwareMonitorLib (C#) 或直接呼叫底層 EC/ACPI 接口。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved