醉里乾坤大,壶中日月长

计算进程CPU使用率

上一篇 / 下一篇  2010-03-26 11:43:16


转自:http://social.microsoft.com/Forums/zh-CN/visualcpluszhchs/thread/bc4ad328-39e6-418b-9deb-a1b0fa7351cf

首先,谢谢版主,代码是C#的不太熟悉。(使用的是 GetProcessTimes函数)

 

问题自己已经解决了,把要点说一下,希望对其他朋友有用。

 

     我使用的是函数NtQuerySystemInformation(ZwQuerySystemInformation),用这个函数可以查很多系统信 息。可以查一下MSDN不过介绍的不过,网上说是微软未公布的Native API。看一下函数原型:

typedef NTSTATUS (__stdcall *NTQUERYSYSTEMINFORMATION)
                             (IN   SYSTEM_INFORMATION_CLASS SystemInformationClass,
                              IN OUT PVOID           SystemInformation,
                              IN   ULONG           SystemInformationLength,
                              OUT   PULONG         ReturnLength OPTIONAL);
NTQUERYSYSTEMINFORMATION NtQuerySystemInformation;

NtQuerySystemInformation这个函数有四个参数:
      第一个参数是dwRecordType,这个参数指定了我们所查询的系统信息类型,为了查询系统PROCESS信息,我们定义一个常量#define NT_PROCESS_INOF 5(谁有更详细的资料可以共享出来)。

      第二个参数是一个指针,这个指针用来返回系统句柄列表,在调用NtQuerySystemInformation函数之前,必须为这个指针分配足够的内存 空间,否则函数调用会出错。

      第三个参数是指定你为HandleList所分配的内存空间大小,单位是byte。

      第四个参数是NtQuerySystemInformation返回的HandleList的大小;如果 NtQuerySystemInformation函数调用成功,返回值将是0,否则可以使用GetLastError()获得详细的错误代码。  



从中可以看到,SystemInformationClass是一个类型信息,它大概提供了50余种信 息,也就是我们可以通过这个函数对大约50多种 的系统信息进行探测或设置。SystemInformation是一个LPVOID型的指针,它为我们提供需要获得的信息,或是我们需要设置的系统信息。 SystemInformationLength是SystemInformation的长度,它根据探测的信息类型来决定。至于 ReturnLength则是系统返回的需要的长度,通常可以设置为空指针(NULL)。

使用这个函数的时候要动态加载“NTDLL.dll”

 

计算进程CPU的使用率就是计算进程占用CPU的时间:

CPUsage = 100 * CurrentProcessCPUsage / TotalProcessCPUsage;

CurrentProcessCPUsage = CurrentProcess.KernelTime + CurrentProcess.UserTime

TotalProcessCPUsage = TotalProcess.KernelTime + TotalProcess.UserTime

 

有什么不正确或不全的,请大家指出来,一起学习进步!


TAG:

 

评分:0

我来说两句

日历

« 2024-03-27  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 72709
  • 日志数: 106
  • 建立时间: 2009-06-05
  • 更新时间: 2011-09-09

RSS订阅

Open Toolbar