如何测得进程/系统的CPU利用率? - theoldman - theoldman - 和讯博客
如何测得进程/系统的CPU利用率? [转贴 2010-01-30 09:07:02]   
虽然可以用PerformanceCounter得到这个数据,但是我发现一使用pdh函数库,  

内存利用立刻上升很多,而且多了6个线程,这不太好  

但是我发现其他的程序,比如Windows  TaskManager,  Process  Explorer,Task  Info  

等就不会出现这种情况,我想可能是用了别的办法,不知道哪位高手知道怎么做到  

---------------------------------------------------------------  

 

//  cpusagent.cpp  (Windows  NT/2000)  

//  

//  Getting  the  CPU  usage  in  percent  on  Windows  NT/2000  

//  

//  (c)2000  Ashot  Oganesyan  K,  SmartLine,  Inc  

//  mailto:ashot@aha.ru,  http://www.protect-me.com,  http://www.codepile.com  

 

#include  <windows.h>  

#include  <conio.h>  

#include  <stdio.h>  

 

#define  SystemBasicInformation              0  

#define  SystemPerformanceInformation  2  

#define  SystemTimeInformation                3  

 

#define  Li2Double(x)  ((double)((x).HighPart)  *  4.294967296E9    (double)((x).LowPart))  

 

typedef  struct  

{  

        DWORD      dwUnknown1;  

        ULONG      uKeMaximumIncrement;  

        ULONG      uPageSize;  

        ULONG      uMmNumberOfPhysicalPages;  

        ULONG      uMmLowestPhysicalPage;  

        ULONG      uMmHighestPhysicalPage;  

        ULONG      uAllocationGranularity;  

        PVOID      pLowestUserAddress;  

        PVOID      pMmHighestUserAddress;  

        ULONG      uKeActiveProcessors;  

        BYTE        bKeNumberProcessors;  

        BYTE        bUnknown2;  

        WORD        wUnknown3;  

}  SYSTEM_BASIC_INFORMATION;  

 

typedef  struct  

{  

        LARGE_INTEGER      liIdleTime;  

        DWORD                      dwSpare[76];  

}  SYSTEM_PERFORMANCE_INFORMATION;  

 

typedef  struct  

{  

        LARGE_INTEGER  liKeBootTime;  

        LARGE_INTEGER  liKeSystemTime;  

        LARGE_INTEGER  liExpTimeZoneBias;  

        ULONG                  uCurrentTimeZoneId;  

        DWORD                  dwReserved;  

}  SYSTEM_TIME_INFORMATION;  

 

 

//  ntdll!NtQuerySystemInformation  (NT  specific!)  

//  

//  The  function  copies  the  system  information  of  the  

//  specified  type  into  a  buffer  

//  

//  NTSYSAPI  

//  NTSTATUS  

//  NTAPI  

//  NtQuerySystemInformation(  

//        IN  UINT  SystemInformationClass,        //  information  type  

//        OUT  PVOID  SystemInformation,              //  pointer  to  buffer  

//        IN  ULONG  SystemInformationLength,    //  buffer  size  in  bytes  

//        OUT  PULONG  ReturnLength  OPTIONAL      //  pointer  to  a  32-bit  

//                                                                              //  variable  that  receives  

//                                                                              //  the  number  of  bytes  

//                                                                              //  written  to  the  buffer    

//  );  

typedef  LONG  (WINAPI  *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);  

 

PROCNTQSI  NtQuerySystemInformation;  

 

 

void  main(void)  

{  

        SYSTEM_PERFORMANCE_INFORMATION  SysPerfInfo;  

        SYSTEM_TIME_INFORMATION                SysTimeInfo;  

        SYSTEM_BASIC_INFORMATION              SysBaseInfo;  

        double                                                  dbIdleTime;  

        double                                                  dbSystemTime;  

        LONG                                                      status;  

        LARGE_INTEGER                                    liOldIdleTime  =  {0,0};  

        LARGE_INTEGER                                    liOldSystemTime  =  {0,0};  

 

        NtQuerySystemInformation  =  (PROCNTQSI)GetProcAddress(  

                                                                                    GetModuleHandle("ntdll"),  

                                                                                  "NtQuerySystemInformation"  

                                                                                  );  

 

        if  (!NtQuerySystemInformation)  

                return;  

 

        //  get  number  of  processors  in  the  system  

        status  =  NtQuerySystemInformation(SystemBasicInformation,&SysBaseInfo,sizeof(SysBaseInfo),NULL);  

        if  (status  !=  NO_ERROR)  

                return;  

          

        printf("\nCPU  Usage  (press  any  key  to  exit):        ");  

        while(!_kbhit())  

        {  

                //  get  new  system  time  

                status  =  NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);  

                if  (status!=NO_ERROR)  

                        return;  

 

                //  get  new  CPU's  idle  time  

                status  =  NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);  

                if  (status  !=  NO_ERROR)  

                        return;  

 

                //  if  it's  a  first  call  -  skip  it  

              if  (liOldIdleTime.QuadPart  !=  0)  

              {  

                        //  CurrentValue  =  NewValue  -  OldValue  

                        dbIdleTime  =  Li2Double(SysPerfInfo.liIdleTime)  -  Li2Double(liOldIdleTime);  

                        dbSystemTime  =  Li2Double(SysTimeInfo.liKeSystemTime)  -  Li2Double(liOldSystemTime);  

 

                        //  CurrentCpuIdle  =  IdleTime  /  SystemTime  

                        dbIdleTime  =  dbIdleTime  /  dbSystemTime;  

 

                        //  CurrentCpuUsage%  =  100  -  (CurrentCpuIdle  *  100)  /  NumberOfProcessors  

                        dbIdleTime  =  100.0  -  dbIdleTime  *  100.0  /  (double)SysBaseInfo.bKeNumberProcessors    0.5;  

 

                        printf("\b\b\b\b%3d%%",(UINT)dbIdleTime);  

              }  

 

                //  store  new  CPU's  idle  and  system  time  

                liOldIdleTime  =  SysPerfInfo.liIdleTime;  

                liOldSystemTime  =  SysTimeInfo.liKeSystemTime;  

                  

                //  wait  one  second  

                Sleep(1000);  

        }  

        printf("\n");  

}
郑重声明:资讯 【如何测得进程/系统的CPU利用率? - theoldman - theoldman - 和讯博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——