ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 5383|ตอบกลับ: 0

[VB.NET] โค้ดการอ่านค่าอุณหภูมิของ CPU แบบเรียลไทม์ด้วยการใช้ OpenHardwareMonitorLib

[คัดลอกลิงก์]

320

กระทู้

512

โพสต์

6583

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6583



ช่วงนี้อากาศร้อนมาก แอดมินก็เลยกระสันต์อยากจะรู้ว่าอุณภูมิของ CPU ในเครื่องแอดมินมันจะร้อนสักกี่องศาเซลเซียสกันแน่ อันที่จริงเราสามารถดูได้จากตัว Windows หรือหาโปรแกรมมาใช้งานมันก็ไม่ได้ยากเย็นอะไรหรอกครับ แต่หากเราคิดแบบนี้ แล้วเราจะเกิดการพัฒนาตัวเองได้อย่างไรล่ะครับทั่นผู้ชม แอดมินบังเอิญไปเจอเว็บ OpenHardwareMonitor.org เขาแจกทั้งโปรแกรมฟรี และแจกซอร์สโค้ดต้นฉบับมาให้ด้วย ก็เลยหาข้อมูลเพิ่มเติมตามเว็บไซต์ต่างๆ แต่โค้ดส่วนใหญ่มักมีปัญหาในการรบกวนการทำงานของ CPU เพราะเวลาที่โปรแกรมของเรารัน มันจะไม่สามารถเคลื่อนที่ฟอร์มได้ ดังนั้นมันจะต้องมีการแยกงานย่อยๆออกไป สิ่งที่แอดมินคิดหาทางแก้คือ ใช้ Threading กับอีกอย่างคือ ใช้ความเก่งอีกอย่างของ VB.NET ด้วย BackgroundWorker ([VB.NET] การใช้งาน Progress Bar ด้วย BackgroundWorker) เกิดปิ๊งไอเดียขึ้นมาเป็นโปรเจคตัวนี้ และอีกหลายๆเวอร์ชั่นที่แอดมินได้ทำเอาไว้ เช่น การพลอตกราฟ การใช้งานร่วมกับ RadialGauge ของ Syncfusion และอื่นๆ ซึ่งแอดมินจะค่อยทยอยแจกโค้ดออกมาในภายหลัง ... (รายละเอียด Chip ของการติดต่อกับบรรดาเซนเซอร์ในการอ่านค่าอุณหภูมิของแต่ละยี่ห้อ ให้ไปดูที่เว็บ OpenHardwareMonitor.Org โดยตรงได้เลย เพราะแอดมินจะไม่ขออธิบายในส่วนนี้ครับ)

สำหรับเวอร์ชั่นนี้อันดับแรกจะเป็นการค้นหาจำนวนของ CPU ที่มีอยู่ในเครื่อง PC ว่ามีกี่ Core แล้วก็ทำการแสดงผลทั้งหมดลงใน ListView Control แล้วจากนั้นก็จะสร้าง ProgressBar ขึ้นมาแบบไดนามิค (@Run Time) ตามจำนวนคอร์ของ CPU เพื่อแสดงปริมาณอุณหภูมิในแบบเรียลไทม์ โดยกระบวนการขั้นตอนในการรีเฟรชค่าอุณหภูมิจะอยู่ที่ BackgroundWorker โดยจังหวะเวลาจะถูกกำหนดโดย Timer1 Control ซึ่งจังหวะเวลานี้จะถูกเปิด/ปิดแบบอัตโนมัติด้วยตัวแปรแบบบูลีน ... (ทิ้งท้าย) เราสามารถนำ BackgroudWorker ไปทำการประยุกต์ใช้งาน เช่น การตรวจจับปริมาณ Process บน Server และหรืออื่นๆได้เยอะแยะมากมายครับผม

หน้าจอการออกแบบ (Design Time)


Add Reference OpenHardwareMonitorLib.dll


การตั้งค่าเพื่อให้โปรแกรมสามารถทำงานได้บนเครื่องอื่น


ตัดแปะโค้ดตามภาพ


หรือใช้สคริปท์นี้ ...
  1. <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
  2.     <security>
  3.       <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
  4.         <!-- UAC Manifest Options
  5.             If you want to change the Windows User Account Control level replace the
  6.             requestedExecutionLevel node with one of the following.

  7.         <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
  8.         <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
  9.         <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

  10.             Specifying requestedExecutionLevel node will disable file and registry virtualization.
  11.             If you want to utilize File and Registry Virtualization for backward
  12.             compatibility then delete the requestedExecutionLevel node.
  13.         -->
  14.         <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
  15.       </requestedPrivileges>
  16.     </security>
  17.   </trustInfo>
คัดลอกไปที่คลิปบอร์ด

มาดูโค้ดทั้งหมดกันเถอะ ...
  1. ' / --------------------------------------------------------------------------------
  2. ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
  3. ' / eMail : thongkorn@hotmail.com
  4. ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
  5. ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
  6. ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
  7. ' / More Info: http://www.g2gnet.com/webboard
  8. ' /
  9. ' / Purpose: Monitor CPU Temperatures with BackgroundWorker.
  10. ' / Microsoft Visual Basic .NET (2010)
  11. ' /
  12. ' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
  13. ' / You can modify and/or distribute without to inform the developer.
  14. ' / --------------------------------------------------------------------------------

  15. ' / Special Thanks: https://openhardwaremonitor.org/
  16. Imports OpenHardwareMonitor.Hardware

  17. Public Class frmCpuTemperature
  18.     '// List of CPUs
  19.     Dim MyList As New List(Of String)()

  20.     '// Toggle Switch On/Off.
  21.     Dim blnSucceed As Boolean = False

  22.     ' / --------------------------------------------------------------------------------
  23.     '// S T A R T ----- H E R E
  24.     Private Sub frmCPUTemperature_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  25.         '// Initialized Timer Interval
  26.         For i As Byte = 1 To 60
  27.             cmbInterval.Items.Add(i)
  28.         Next
  29.         With cmbInterval
  30.             .MaxDropDownItems = 10
  31.             .IntegralHeight = False
  32.             .SelectedIndex = 0
  33.         End With
  34.         '//
  35.         '// Initialized ListView
  36.         Call InitListView()
  37.         '// Create ProgressBae Control @Runtime.
  38.         Call CreateCPUProgress()

  39.         '// Initialized BackGroundWorker.
  40.         With BackgroundWorker1
  41.             .WorkerReportsProgress = True
  42.             .WorkerSupportsCancellation = True
  43.         End With
  44.         '//
  45.         System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
  46.         BackgroundWorker1.RunWorkerAsync()
  47.         '// Initialized and start Timer1
  48.         Timer1.Interval = 1000
  49.         Timer1.Enabled = True
  50.         '//
  51.     End Sub

  52.     '// Create ProgressBae Control @Runtime.
  53.     Private Sub CreateCPUProgress()
  54.         Dim cp As New Computer()
  55.         cp.Open()
  56.         cp.CPUEnabled = True
  57.         '//
  58.         Dim cpu = cp.Hardware.Where(Function(h) h.HardwareType = HardwareType.CPU).FirstOrDefault()
  59.         Dim tempSensors = cpu.Sensors.Where(Function(s) s.SensorType = SensorType.Temperature)
  60.         tempSensors.ToList.ForEach(Sub(s) MyList.Add(s.Name))
  61.         cp.CPUEnabled = False
  62.         cp.Close()

  63.         '// Create ProgressBar @Run Time
  64.         Dim pgbX As Integer = 21
  65.         Dim pgbY As Integer = 216
  66.         Dim MyHeight As Integer = Me.Height
  67.         For i As Byte = 0 To MyList.Count - 1
  68.             Dim p As New ProgressBar
  69.             With p
  70.                 .Name = MyList(i).ToString
  71.                 .Size = New Size(653, 23)
  72.                 .Maximum = 100
  73.                 .Minimum = 0
  74.                 .Location = New Point(pgbX, pgbY)
  75.                 .Visible = True
  76.             End With
  77.             Me.Controls.Add(p)
  78.             '// Label show CPU Name
  79.             Dim L1 As New Label
  80.             With L1
  81.                 .Name = "CPU" & i
  82.                 .Location = New Point(pgbX, pgbY - p.Height + 6)
  83.                 .Text = MyList(i).ToString
  84.                 .Visible = True
  85.             End With
  86.             Me.Controls.Add(L1)
  87.             '// Label show percent.
  88.             Dim L2 As New Label
  89.             With L2
  90.                 .Name = "C" & i
  91.                 .Location = New Point(p.Width - 10, pgbY - p.Height + 6)
  92.                 .Text = "0C"
  93.                 .Visible = True
  94.             End With
  95.             Me.Controls.Add(L2)
  96.             '//
  97.             pgbY += 40
  98.             Me.Height = MyHeight + p.Height + 60
  99.         Next
  100.     End Sub

  101.     '// BackgroundWorker - Events DoWork
  102.     Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
  103.         '// Refer OpenHardwareMonitor
  104.         Dim cp As New Computer()
  105.         cp.Open()
  106.         cp.CPUEnabled = True
  107.         '// Additional.
  108.         'cp.GPUEnabled = True
  109.         'cp.HDDEnabled = True
  110.         'cp.RAMEnabled = True
  111.         'cp.FanControllerEnabled = True
  112.         'cp.MainboardEnabled = True
  113.         '//
  114.         lvwData.Items.Clear()
  115.         For Each hardwareItem In cp.Hardware
  116.             hardwareItem.Update()
  117.             '// Detect Sensor only.
  118.             For Each sensor In hardwareItem.Sensors
  119.                 If (sensor.SensorType = SensorType.Temperature) Then
  120.                     Dim LV As ListViewItem
  121.                     LV = lvwData.Items.Add(sensor.Name)
  122.                     '// Split name --> OpenHardwareMonitor.Hardware.CPU.IntelCPU --> Get IntelCPU (or AMD)
  123.                     Dim hw() As String = Split(sensor.Hardware.ToString, ".")
  124.                     LV.SubItems.Add(hw(UBound(hw)))
  125.                     '// Sensor Value.
  126.                     LV.SubItems.Add(Format(sensor.Value, "0.0"))
  127.                     '// Display value on the ProgressBar.
  128.                     For i As Byte = 0 To MyList.Count - 1
  129.                         If MyList(i).ToString = sensor.Name Then
  130.                             '// Access it indirectly through a new control.
  131.                             Dim pgb As ProgressBar = Me.Controls(MyList(i).ToString)
  132.                             pgb.Value = sensor.Value
  133.                             Dim lbl As Label = Me.Controls("C" & i)
  134.                             lbl.Text = sensor.Value & "C"
  135.                         End If
  136.                     Next
  137.                 End If
  138.             Next
  139.         Next
  140.     End Sub

  141.     '// When change occurs.
  142.     Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
  143.         '//
  144.         '// Me.ProgressBar1.Value = e.ProgressPercentage
  145.     End Sub

  146.     '// When finished.
  147.     Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
  148.         '// ON
  149.         blnSucceed = True
  150.     End Sub

  151.     '// Switch On/Off
  152.     Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
  153.         If blnSucceed Then
  154.             BackgroundWorker1.RunWorkerAsync()
  155.             '// OFF
  156.             blnSucceed = False
  157.             '//
  158.         End If
  159.     End Sub

  160.     Private Sub frmCpuTemperature_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
  161.         BackgroundWorker1.Dispose()
  162.         Timer1.Enabled = False
  163.         Application.Exit()
  164.     End Sub

  165.     '/ Initialize ListView Control
  166.     Private Sub InitListView()
  167.         With lvwData
  168.             .View = View.Details
  169.             .GridLines = True
  170.             .FullRowSelect = True
  171.             .HideSelection = False
  172.             .MultiSelect = False
  173.             '/ Use 2 Columns, with the first digit having Index = 0
  174.             .Columns.Add("Sensor.Name", lvwData.Width \ 3)
  175.             .Columns.Add("Sensor.Hardware", lvwData.Width \ 3 - 30)
  176.             .Columns.Add("Sensor.Value (Celsius)", lvwData.Width \ 3 - 30)
  177.         End With
  178.     End Sub

  179.     Private Sub LinkLabel1_LinkClicked(sender As System.Object, e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
  180.         Process.Start("https://openhardwaremonitor.org/")
  181.     End Sub

  182.     Private Sub cmbInterval_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbInterval.SelectedIndexChanged
  183.         '// 1 Second = 1000 millisecond.
  184.         Timer1.Interval = Val(cmbInterval.Text) * 1000
  185.     End Sub
  186. End Class
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-11-27 22:51 , Processed in 0.112134 second(s), 5 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้