vb.net如何获取当前进程的cpu和内存使用率?

[复制链接]
查看11 | 回复6 | 2021-1-27 05:16:42 | 显示全部楼层 |阅读模式
就是为了能在进程运行时隔2-3秒更新一次当前进程的cpu使用率(%)和内存(MB)到label7中
不要获取pid的方式,因为程序后面我要改名字的。
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:16:42 | 显示全部楼层
不明白为什么这么抗拒用PID,如果当前进程的话,Process.GetCurrentProcess()方法可以返回当前进程对象,通过这个对象取pid完全没有取错进程的可能。倒是通过ProcessName来取,有可能同名进程会有无法区分的问题(这个问题也不是解决不了)。
方法1:用性能计数器
PublicClassForm1
DimprocAsProcess
DimcpuCounterAsPerformanceCounter
DimramCounterAsPerformanceCounter
PrivateSubTimer1_Tick(senderAsObject,eAsEventArgs)HandlesTimer1.Tick
Label1.Text=String.Format(
"CPU:{0}%MEM:{1}MB",
cpuCounter.NextValue().ToString("#0.##"),
(ramCounter.NextValue()>>16).ToString("###,###.##"))
EndSub
PrivateSubForm1_Load(senderAsObject,eAsEventArgs)HandlesMyBase.Load
proc=Process.GetCurrentProcess()
cpuCounter=NewPerformanceCounter("Process","%ProcessorTime",proc.ProcessName)
ramCounter=NewPerformanceCounter("Process","WorkingSet",proc.ProcessName)
EndSub
EndClass
方法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,这个只是我在瞎猜,你想细抠的话可以深挖一下。
PublicClassForm1
DimprocAsProcess
DimprevTimeAsTimeSpan=TimeSpan.Zero
PrivateSubTimer1_Tick(senderAsObject,eAsEventArgs)HandlesTimer1.Tick
Label1.Text=String.Format(
"CPU:{0}%Private:{1}MBWorkingset:{2}MB",
100*(proc.TotalProcessorTime-prevTime).TotalMilliseconds/2000/Environment.ProcessorCount,
(proc.PrivateMemorySize64>>16).ToString("###,##0.##"),
(proc.WorkingSet64>>16).ToString("###,##0.##"))
prevTime=proc.TotalProcessorTime
EndSub
PrivateSubForm1_Load(senderAsObject,eAsEventArgs)HandlesMyBase.Load
proc=Process.GetCurrentProcess()
EndSub
EndClass
方法三:Management命名空间下面,用ManagementObjectSearcher进行wmi查询
ImportsSystem.Management
PublicClassForm1
DimprocAsProcess
PrivateSubTimer1_Tick(senderAsObject,eAsEventArgs)HandlesTimer1.Tick
DimsearcherAsManagementObjectSearcher=
NewManagementObjectSearcher(
"Select*fromWin32_PerfFormattedData_PerfProc_ProcesswhereIDProcess="&Process.GetCurrentProcess().Id)
DimobjAsManagementObject=searcher.Get().Cast(OfManagementObject).First()
Label1.Text=String.Format(
"CPU:{0}%Private:{1}MBWorkingset:{1}MB",
obj("PercentProcessorTime"),
Convert.ToInt64(obj("PrivateBytes")>>16).ToString("###,##0.##"),
Convert.ToInt64(obj("WorkingSet")>>16).ToString("###,##0.##"))
EndSub
EndClass
方法四,直接用wmi对象进行查询,本质上和方法三是一样的,懒得写了,网上一搜大把。这是VB6年代的东西,.net里应该也能用。随便搜了一个
https://zhidao.baidu.com/question/2078259333515194308.html

这些方法里最关键的是内存,简直是五花八门,相同的KEY名字,结果完全不一样,没这精力去深究了,你自己试试看吧。
回复

使用道具 举报

千问 | 2021-1-27 05:16:42 | 显示全部楼层
我4种都试过了,cpu使用率相差不大,关键是内存,任务管理器显示使用了14MB,3种方法都是300+。这是为啥呀?
回复

使用道具 举报

千问 | 2021-1-27 05:16:42 | 显示全部楼层
所以关键的问题是,你想获取哪个内存?
内存相关的参数有很多,workingset(分private和sharable),paged,PrivateBytes,virtualmemory(分private和sharable)……
https://blog.csdn.net/wzsy/article/details/42737907
这个文章解释了大部分类型,如果想完全弄清,就需要把任务管理器里你想取的那一列实际对应到哪个参数给找到。多搜搜吧,再实际跑个程序测一测。这一块我也不清楚,帮不了你了。
回复

使用道具 举报

千问 | 2021-1-27 05:16:42 | 显示全部楼层
直接获取任务管理器里的数据。
回复

使用道具 举报

千问 | 2021-1-27 05:16:42 | 显示全部楼层
哥们,伸手有个限度。
回复

使用道具 举报

千问 | 2021-1-27 05:16:42 | 显示全部楼层
。。。
不过我自己想了一个法给解决了。
pf1=NewPerformanceCounter("Process","WorkingSet-Private",names)
cpu=cpucounter.NextValue()
Label7.Text="CPU使用率(单内核):"&Math.Round(cpu,1)&"%"&vbCrLf&"内存使用量:"&Math.Round(pf1.NextValue()/1024/1024,2)&"MB"
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行