不明白为什么这么抗拒用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名字,结果完全不一样,没这精力去深究了,你自己试试看吧。
|