问题描述
请教各位大侠,我定义了如下计数器求某个进程ProcessName的cpu和内存使用率:PerformanceCounterCpuPercetageTime=newPerformanceCounter("Processor","%ProcessorTime",ProcessName);PerformanceCounterVMSize=newPerformanceCounter("Process","PrivateBytes",ProcessName);PerformanceCounterVirtualBytes=newPerformanceCounter("Process","VirtualBytes",ProcessName);PerformanceCounterMemUsage=newPerformanceCounter("Process","WorkingSet",ProcessName);cpu和内存使用率的采样值我用如下代码实现:data[0]=CpuPercetageTime.NextValue().ToString()+"%";data[1]=(VMSize.NextValue()/1024).ToString()+"K";data[2]=(VirtualBytes.NextValue()/1024).ToString()+"K";data[3]=(MemUsage.NextValue()/1024).ToString()+"K";但是,data[0]的值出现了120%的情况,这是不合理的,那到底该怎么才能正确求得某个进程的cpu使用情况呢?还有cpu总的使用率是用如下的计数器来定义吧?PerformanceCounterCpuPercetageTime=newPerformanceCounter("Processor","%ProcessorTime","_Total");PS:如果用WMI只能求得某一点的情况,不能实时获得数据,不是我想要的,我想实时获得这些值,每隔0.1秒采样一次,所以用了NextValue()来获取,请问还有更好的办法吗?请各位大侠们帮忙啊,谢谢了:)
解决方案
解决方案二:
个人感觉这玩意不是很好用,顺便问下,你知道怎么获得计算机总共内存吗
解决方案三:
publicclassMemoryManager{[DllImport("kernel32")]publicstaticexternvoidGlobalMemoryStatus(refMEMORY_INFOmeminfo);///<summary>///获得系统总物理内存///</summary>///<returns></returns>publicstaticlongGetTotalPhys(){MEMORY_INFOMemInfo;MemInfo=newMEMORY_INFO();GlobalMemoryStatus(refMemInfo);return(long)MemInfo.dwTotalPhys;}///<summary>///获得系统当前在使用的物理内存///</summary>///<returns></returns>publicstaticlongGetMemoryLoad(){MEMORY_INFOMemInfo;MemInfo=newMEMORY_INFO();GlobalMemoryStatus(refMemInfo);return(long)MemInfo.dwMemoryLoad;}///<summary>///获得系统当前在使用的物理内存///</summary>///<paramname="categoryName">此性能计数器关联的性能计数器类别(性能对象)的名称</param>///<paramname="CounterName">性能计数器的名称</param>///<paramname="instanceName">性能计数器类别实例的名称,或者为空字符串("")(如果该类别包含单个实例)</param>///<returns></returns>publicstaticdoubleGetCpuLoad(stringcategoryName,stringCounterName,stringinstanceName){PerformanceCounterpc=newPerformanceCounter(categoryName,CounterName,instanceName);return(double)pc.NextValue();}}//定义内存的信息结构[StructLayout(LayoutKind.Sequential)]publicstructMEMORY_INFO{publicuintdwLength;publicuintdwMemoryLoad;publicuintdwTotalPhys;publicuintdwAvailPhys;publicuintdwTotalPageFile;publicuintdwAvailPageFile;publicuintdwTotalVirtual;publicuintdwAvailVirtual;}
解决方案四:
WMI不行?无事...飘过~~~
解决方案五:
使用wmi获得的信息,不宜循环刷新,这样代价比较大,所以我采用性能计数器来获得。谢谢whChina了,顺便再请教一下。我在上面写的代码第一行写错了,就是CPU的使用率,定义计数器时应该是这样的:PerformanceCounterCpuPercetageTime=newPerformanceCounter("Process","%ProcessorTime",ProcessName);category是“Process”而不是“Processor”.现在困扰我的问题是data[0]=CpuPercetageTime.NextValue().ToString()+"%";输出data[0]的信息中居然出现了123%的数据,这是为什么呢?请帮忙找原因。
解决方案六:
我记得不是百分比····CPU使用率是算出来的计数器不提供百分比···我以前也遇到过···最后我用WIN32解决的。。。。GetSystemInfo
解决方案七:
Deathsign能讲明白点吗?CPU使用率该怎么计算?如果不是百分比,那NextValue()得到的值是什么?你用WIN32解决的,那如何在0.1秒甚至更少的时间间隔内循环刷新某个进程的CPU使用率呢?GetSystemInfo是怎么用的?