注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

获得多任务实时操作系统的CPU使用率  

2010-01-19 11:31:36|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
如以下程序,IDLE时间是怎样计算的?  
   
  //C++:实时获取CPU使用率的类(源码)   出处:www.csdn.net    
     
  //=========================================================  
  //  
  //   Copyright   (c)   2000-2004     iWise   Technologies,Co.   Ltd.  
  //   All   Rights   Reserved.  
  //  
  //   Product:   iW988  
  //   File:   CpuUsage.h  
  //   Created:   天衣有缝  
  //      
  //   Description:  
  //           ValueAdded   main   program   for   iW988.  
  //                                       Contact:  
  //                                               waterpub@mail.csdn.net  
  //  
  //=========================================================  
   
  #pragma   once    
   
  #define   SystemBasicInformation   0    
  #define   SystemPerformanceInformation   2    
  #define   SystemTimeInformation   3    
   
  #define   Li2Double(x)   ((double)((x).HighPart)   *   4.294967296E9   +   (double)((x).LowPart))    
   
  class   CCpuUsage  
  {  
          public:  
                  CCpuUsage();  
                  ~CCpuUsage();  
   
          public:  
                  int   GetCpuUsage();                                               //得到系统cpu利用率  
                  int   SetRefreshInterval(int   milli_sec);       //定时刷新间隔  
   
          private:  
                          //类型定义  
                          typedef   LONG   (WINAPI   *PROCNTQSI)(UINT,PVOID,ULONG,PULONG);  
   
                  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;  
   
                  //变量定义  
                  SYSTEM_PERFORMANCE_INFORMATION   SysPerfInfo;  
                  SYSTEM_TIME_INFORMATION   SysTimeInfo;  
                  SYSTEM_BASIC_INFORMATION   SysBaseInfo;  
   
  double   dbIdleTime;  
                  double   dbSystemTime;  
   
                  LONG   status;  
   
                  LARGE_INTEGER   liOldIdleTime;  
                  LARGE_INTEGER   liOldSystemTime;  
   
                  PROCNTQSI   NtQuerySystemInformation;  
   
                  int   m_nCpuUsage;  
   
                  //定时  
                  HWND   m_hWnd;  
                  int     m_nRefreshInterval;//默认为1000毫秒  
                  int     m_nTimerID;  
   
          private:  
                  static   void   CalcCpuUsage(HWND   hwnd,   UINT   uMsg,   UINT_PTR   idEvent,   DWORD   dwTime);  
                  int   OnTimer();  
  };  
   
  inline   CCpuUsage::CCpuUsage()  
  {  
          //  
          m_hWnd   =   NULL;  
          m_nRefreshInterval   =   1000;  
          m_nTimerID   =   1000;  
          m_nCpuUsage   =   0;  
   
          //  
          memset(&liOldIdleTime     ,       0,   sizeof(LARGE_INTEGER));  
          memset(&liOldSystemTime,       0,   sizeof(LARGE_INTEGER));    
   
          //  
          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;  
   
          //   create   control   for   timer  
          m_hWnd   =   ::CreateWindow("static",   "",   0,   0,   0,   0,   0,   NULL,   NULL,   0,   NULL);  
          ::SetWindowLong(m_hWnd   ,   GWL_USERDATA   ,   (long)(this)   );  
   
          TIMERPROC   tp   =   (TIMERPROC)CalcCpuUsage;  
          SetTimer(m_hWnd   ,   m_nTimerID,   m_nRefreshInterval,   tp);  
   
  }  
   
  inline   CCpuUsage::~CCpuUsage()  
  {  
          KillTimer(m_hWnd   ,   m_nTimerID);  
          DestroyWindow(m_hWnd);  
  }  
   
  inline   void   CCpuUsage::CalcCpuUsage(  
                                  HWND   hwnd,  
                                  UINT   uMsg,  
                                  UINT_PTR   idEvent,  
                                  DWORD   dwTime  
  )  
  {  
          CCpuUsage*   pCpu   =   (CCpuUsage*)::GetWindowLong(hwnd   ,   GWL_USERDATA);  
   
          if   (   pCpu   )  
          {  
                  pCpu->OnTimer();  
          }  
   
  }  
   
  inline   int   CCpuUsage::OnTimer()  
  {  
          status   =   NtQuerySystemInformation(SystemTimeInformation,&SysTimeInfo,sizeof(SysTimeInfo),0);  
   
          if   (status!=NO_ERROR)  
                  return   0;  
   
          //   get   new   CPU's   idle   time  
          status   =   NtQuerySystemInformation(SystemPerformanceInformation,&SysPerfInfo,sizeof(SysPerfInfo),NULL);  
          if   (status   !=   NO_ERROR)  
                  return   0;  
   
          //   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;  
   
                          m_nCpuUsage   =   (UINT)dbIdleTime;  
                  }  
   
          //   store   new   CPU's   idle   and   system   time  
          liOldIdleTime   =   SysPerfInfo.liIdleTime;  
          liOldSystemTime   =   SysTimeInfo.liKeSystemTime;  
   
          //   wait   one   second  
   
          return   0;  
  }  
   
  inline   int   CCpuUsage::GetCpuUsage()  
  {  
          return   m_nCpuUsage;  
  }  
   
  inline   int   CCpuUsage::SetRefreshInterval(int   milli_sec)  
  {  
          m_nRefreshInterval   =   milli_sec;  
   
          if   (   m_hWnd   )  
          {  
                  TIMERPROC   tp   =   (TIMERPROC)CalcCpuUsage;  
                  SetTimer(m_hWnd,   m_nTimerID,   m_nRefreshInterval   ,tp);  
          }  
   
          return   0;  
   
  }  
  评论这张
 
阅读(769)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018