|
ช่วงนี้อากาศร้อนมาก แอดมินก็เลยกระสันต์อยากจะรู้ว่าอุณภูมิของ 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
การตั้งค่าเพื่อให้โปรแกรมสามารถทำงานได้บนเครื่องอื่น
ตัดแปะโค้ดตามภาพ
หรือใช้สคริปท์นี้ ...
- <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
- <security>
- <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
- <!-- UAC Manifest Options
- If you want to change the Windows User Account Control level replace the
- requestedExecutionLevel node with one of the following.
- <requestedExecutionLevel level="asInvoker" uiAccess="false" />
- <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
- <requestedExecutionLevel level="highestAvailable" uiAccess="false" />
- Specifying requestedExecutionLevel node will disable file and registry virtualization.
- If you want to utilize File and Registry Virtualization for backward
- compatibility then delete the requestedExecutionLevel node.
- -->
- <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
- </requestedPrivileges>
- </security>
- </trustInfo>
คัดลอกไปที่คลิปบอร์ด
มาดูโค้ดทั้งหมดกันเถอะ ...
- ' / --------------------------------------------------------------------------------
- ' / Developer : Mr.Surapon Yodsanga (Thongkorn Tubtimkrob)
- ' / eMail : thongkorn@hotmail.com
- ' / URL: http://www.g2gnet.com (Khon Kaen - Thailand)
- ' / Facebook: https://www.facebook.com/g2gnet (For Thailand)
- ' / Facebook: https://www.facebook.com/commonindy (Worldwide)
- ' / More Info: http://www.g2gnet.com/webboard
- ' /
- ' / Purpose: Monitor CPU Temperatures with BackgroundWorker.
- ' / Microsoft Visual Basic .NET (2010)
- ' /
- ' / This is open source code under @CopyLeft by Thongkorn Tubtimkrob.
- ' / You can modify and/or distribute without to inform the developer.
- ' / --------------------------------------------------------------------------------
- ' / Special Thanks: https://openhardwaremonitor.org/
- Imports OpenHardwareMonitor.Hardware
- Public Class frmCpuTemperature
- '// List of CPUs
- Dim MyList As New List(Of String)()
- '// Toggle Switch On/Off.
- Dim blnSucceed As Boolean = False
- ' / --------------------------------------------------------------------------------
- '// S T A R T ----- H E R E
- Private Sub frmCPUTemperature_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- '// Initialized Timer Interval
- For i As Byte = 1 To 60
- cmbInterval.Items.Add(i)
- Next
- With cmbInterval
- .MaxDropDownItems = 10
- .IntegralHeight = False
- .SelectedIndex = 0
- End With
- '//
- '// Initialized ListView
- Call InitListView()
- '// Create ProgressBae Control @Runtime.
- Call CreateCPUProgress()
- '// Initialized BackGroundWorker.
- With BackgroundWorker1
- .WorkerReportsProgress = True
- .WorkerSupportsCancellation = True
- End With
- '//
- System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
- BackgroundWorker1.RunWorkerAsync()
- '// Initialized and start Timer1
- Timer1.Interval = 1000
- Timer1.Enabled = True
- '//
- End Sub
- '// Create ProgressBae Control @Runtime.
- Private Sub CreateCPUProgress()
- Dim cp As New Computer()
- cp.Open()
- cp.CPUEnabled = True
- '//
- Dim cpu = cp.Hardware.Where(Function(h) h.HardwareType = HardwareType.CPU).FirstOrDefault()
- Dim tempSensors = cpu.Sensors.Where(Function(s) s.SensorType = SensorType.Temperature)
- tempSensors.ToList.ForEach(Sub(s) MyList.Add(s.Name))
- cp.CPUEnabled = False
- cp.Close()
- '// Create ProgressBar @Run Time
- Dim pgbX As Integer = 21
- Dim pgbY As Integer = 216
- Dim MyHeight As Integer = Me.Height
- For i As Byte = 0 To MyList.Count - 1
- Dim p As New ProgressBar
- With p
- .Name = MyList(i).ToString
- .Size = New Size(653, 23)
- .Maximum = 100
- .Minimum = 0
- .Location = New Point(pgbX, pgbY)
- .Visible = True
- End With
- Me.Controls.Add(p)
- '// Label show CPU Name
- Dim L1 As New Label
- With L1
- .Name = "CPU" & i
- .Location = New Point(pgbX, pgbY - p.Height + 6)
- .Text = MyList(i).ToString
- .Visible = True
- End With
- Me.Controls.Add(L1)
- '// Label show percent.
- Dim L2 As New Label
- With L2
- .Name = "C" & i
- .Location = New Point(p.Width - 10, pgbY - p.Height + 6)
- .Text = "0C"
- .Visible = True
- End With
- Me.Controls.Add(L2)
- '//
- pgbY += 40
- Me.Height = MyHeight + p.Height + 60
- Next
- End Sub
- '// BackgroundWorker - Events DoWork
- Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
- '// Refer OpenHardwareMonitor
- Dim cp As New Computer()
- cp.Open()
- cp.CPUEnabled = True
- '// Additional.
- 'cp.GPUEnabled = True
- 'cp.HDDEnabled = True
- 'cp.RAMEnabled = True
- 'cp.FanControllerEnabled = True
- 'cp.MainboardEnabled = True
- '//
- lvwData.Items.Clear()
- For Each hardwareItem In cp.Hardware
- hardwareItem.Update()
- '// Detect Sensor only.
- For Each sensor In hardwareItem.Sensors
- If (sensor.SensorType = SensorType.Temperature) Then
- Dim LV As ListViewItem
- LV = lvwData.Items.Add(sensor.Name)
- '// Split name --> OpenHardwareMonitor.Hardware.CPU.IntelCPU --> Get IntelCPU (or AMD)
- Dim hw() As String = Split(sensor.Hardware.ToString, ".")
- LV.SubItems.Add(hw(UBound(hw)))
- '// Sensor Value.
- LV.SubItems.Add(Format(sensor.Value, "0.0"))
- '// Display value on the ProgressBar.
- For i As Byte = 0 To MyList.Count - 1
- If MyList(i).ToString = sensor.Name Then
- '// Access it indirectly through a new control.
- Dim pgb As ProgressBar = Me.Controls(MyList(i).ToString)
- pgb.Value = sensor.Value
- Dim lbl As Label = Me.Controls("C" & i)
- lbl.Text = sensor.Value & "C"
- End If
- Next
- End If
- Next
- Next
- End Sub
- '// When change occurs.
- Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
- '//
- '// Me.ProgressBar1.Value = e.ProgressPercentage
- End Sub
- '// When finished.
- Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
- '// ON
- blnSucceed = True
- End Sub
- '// Switch On/Off
- Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
- If blnSucceed Then
- BackgroundWorker1.RunWorkerAsync()
- '// OFF
- blnSucceed = False
- '//
- End If
- End Sub
- Private Sub frmCpuTemperature_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
- BackgroundWorker1.Dispose()
- Timer1.Enabled = False
- Application.Exit()
- End Sub
- '/ Initialize ListView Control
- Private Sub InitListView()
- With lvwData
- .View = View.Details
- .GridLines = True
- .FullRowSelect = True
- .HideSelection = False
- .MultiSelect = False
- '/ Use 2 Columns, with the first digit having Index = 0
- .Columns.Add("Sensor.Name", lvwData.Width \ 3)
- .Columns.Add("Sensor.Hardware", lvwData.Width \ 3 - 30)
- .Columns.Add("Sensor.Value (Celsius)", lvwData.Width \ 3 - 30)
- End With
- End Sub
- Private Sub LinkLabel1_LinkClicked(sender As System.Object, e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
- Process.Start("https://openhardwaremonitor.org/")
- End Sub
- Private Sub cmbInterval_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbInterval.SelectedIndexChanged
- '// 1 Second = 1000 millisecond.
- Timer1.Interval = Val(cmbInterval.Text) * 1000
- End Sub
- End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดต้นฉบับ VB.NET (2010) ได้ที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|