就是為了能在行程運行時隔2-3秒更新一次當前行程的cpu使用率(%)和記憶體(MB)到label7中
不要獲取pid的方式,因為程式后面我要改名字的。
uj5u.com熱心網友回復:
不明白為什么這么抗拒用PID,如果當前行程的話,Process.GetCurrentProcess()方法可以回傳當前行程物件,通過這個物件取pid完全沒有取錯行程的可能。倒是通過ProcessName來取,有可能同名行程會有無法區分的問題(這個問題也不是解決不了)。方法1:用性能計數器
Public Class Form1
Dim proc As Process
Dim cpuCounter As PerformanceCounter
Dim ramCounter As PerformanceCounter
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Label1.Text = String.Format(
"CPU: {0}% MEM: {1}MB",
cpuCounter.NextValue().ToString("#0.##"),
(ramCounter.NextValue() >> 16).ToString("###,###.##"))
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
proc = Process.GetCurrentProcess()
cpuCounter = New PerformanceCounter("Process", "% Processor Time", proc.ProcessName)
ramCounter = New PerformanceCounter("Process", "Working Set", proc.ProcessName)
End Sub
End Class
方法2:
用 Process物件的TotalProcessorTime獲取總的CPU時間(需要減去上一次的TotalProcessorTime,并且除以時間間隔,再除以邏輯核數)
100 * (proc.TotalProcessorTime - prevTime).TotalMilliseconds / 2000 / Environment.ProcessorCount
'計數周期是2秒,所以除以2000,意思是這個周期內,本行程占用了多少CPU時間,乘以100是因為在求百分比
'prevTime是上一次統計到的proc.TotalProcessorTime,需要對兩次統計的結果求差值才行
記憶體就比較復雜了, proc.Workingset64和性能計數器的workingset不是一回事,懷疑proc.Workingset64 + proc.PrivateMemorysize64才是性能計數器的workingset,這個只是我在瞎猜,你想細摳的話可以深挖一下。
Public Class Form1
Dim proc As Process
Dim prevTime As TimeSpan = TimeSpan.Zero
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Label1.Text = String.Format(
"CPU: {0}% Private:{1}MB Workingset:{2}MB",
100 * (proc.TotalProcessorTime - prevTime).TotalMilliseconds / 2000 / Environment.ProcessorCount,
(proc.PrivateMemorySize64 >>16).ToString("###,##0.##"),
(proc.WorkingSet64 >>16).ToString("###,##0.##"))
prevTime = proc.TotalProcessorTime
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
proc = Process.GetCurrentProcess()
End Sub
End Class
方法三:Management命名空間下面,用ManagementObjectSearcher進行wmi查詢
Imports System.Management
Public Class Form1
Dim proc As Process
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Dim searcher As ManagementObjectSearcher =
New ManagementObjectSearcher(
"Select * from Win32_PerfFormattedData_PerfProc_Process where IDProcess=" & Process.GetCurrentProcess().Id)
Dim obj As ManagementObject = searcher.Get().Cast(Of ManagementObject).First()
Label1.Text = String.Format(
"CPU: {0}% Private:{1}MB Workingset:{1}MB",
obj("PercentProcessorTime"),
Convert.ToInt64(obj("PrivateBytes") >> 16).ToString("###,##0.##"),
Convert.ToInt64(obj("WorkingSet") >> 16).ToString("###,##0.##"))
End Sub
End Class
方法四,直接用wmi物件進行查詢,本質上和方法三是一樣的,懶得寫了,網上一搜大把。這是VB6年代的東西,.net里應該也能用。隨便搜了一個
https://zhidao.baidu.com/question/2078259333515194308.html
這些方法里最關鍵的是記憶體,簡直是五花八門,相同的KEY名字,結果完全不一樣,沒這精力去深究了,你自己試試看吧。
uj5u.com熱心網友回復:
我4種都試過了,cpu使用率相差不大,關鍵是記憶體,任務管理器顯示使用了14MB,3種方法都是300+。這是為啥呀?uj5u.com熱心網友回復:
所以關鍵的問題是,你想獲取哪個記憶體?記憶體相關的引數有很多,workingset (分private和sharable), paged, PrivateBytes, virtual memory(分private和sharable)……
https://blog.csdn.net/wzsy/article/details/42737907
這個文章解釋了大部分型別,如果想完全弄清,就需要把任務管理器里你想取的那一列實際對應到哪個引數給找到。多搜搜吧,再實際跑個程式測一測。這一塊我也不清楚,幫不了你了。
uj5u.com熱心網友回復:
直接獲取任務管理器里的資料。uj5u.com熱心網友回復:
哥們,伸手有個限度。uj5u.com熱心網友回復:
。。。不過我自己想了一個法給解決了。
pf1 = New PerformanceCounter("Process", "Working Set - Private", names)
cpu = cpucounter.NextValue()
Label7.Text = "CPU使用率(單內核):" & Math.Round(cpu, 1) & "%" & vbCrLf & "記憶體使用量:" & Math.Round(pf1.NextValue() / 1024 / 1024 , 2) & "MB"
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/16836.html
標籤:VB基礎類
上一篇:VB如何判斷系統是注銷后登錄
