设为首页 加入收藏

TOP

15.2.4 本地监控示例--各进程CPU占用率(2)
2013-10-07 14:38:10 来源: 作者: 【 】 浏览:49
Tags:15.2.4 本地 监控 示例 进程 CPU 占用

15.2.4  本地监控示例--各进程CPU占用率(2)

为CGetCpuUseageDlg类添加成员函数,此函数用于获取更新每个进程的CPU占用率,代码如下:

  1. void Process(void);         //取得更新每个进程的CPU占用率 

(6)在CGetCpuUseageDlg的类成员函数Process()中,添加如下处理代码:
  1. 01  void CGetCpuUseageDlg:: Process(void)  
  2. 02  {  
  3. 03      //创建进程快照句柄  
  4. 04      HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,   
  5.        0);  
  6. 05      if(INVALID_HANDLE_VALUE == hProcessSnap)  
  7. 06          return;  
  8. 07      int i=0cnt=0;  
  9. 08      cnt = m_lstCtrl_CpuUsage.GetItemCount();    //取得列表项总项数  
  10. 09      for(i=0; i<cnt; i++)  
  11. 10      {//预先设置每个进程的列表状态为退出状态  
  12. 11          DWORD itemData = m_lstCtrl_CpuUsage.GetItemData(i);  
  13.             //取得与此进程相关列表数据  
  14. 12          CPUUSEAGE_STRUCT *pCpuS = (CPUUSEAGE_STRUCT *)itemData;  
  15. 13          pCpuS->bExit = true;  
  16. 14      }  
  17. 15      PROCESSENTRY32 process32;  
  18. 16      process32.dwSize = sizeof(PROCESSENTRY32);  
  19. 17      //遍历进程快照,取得每个进程信息  
  20. 18      int index = 0;  
  21. 19      BOOL bMore = ::Process32First(hProcessSnap, &process32);  
  22.         //取得第1个进程信息  
  23. 20      while (bMore)  
  24. 21      {  
  25. 22          bool bFind = false;  
  26. 23          cnt =m_lstCtrl_CpuUsage.GetItemCount();/    /取得列表框总项数  
  27. 24          for(i=0; i<cnt; i++)  
  28. 25          {//查看当前列表是否存在此进程  
  29. 26              DWORD itemData = m_lstCtrl_CpuUsage.GetItemData(i);  
  30. 27              CPUUSEAGE_STRUCT *pCpuS = (CPUUSEAGE_STRUCT *)itemData;  
  31. 28              if(pCpuS->pID == process32.th32ProcessID)  
  32. 29              {  
  33. 30                  CString s;  
  34. 31          s.Format("%d",pCpuS->m_CpuUse.GetCpuUsage(process32.th32  
  35.             ProcessID));  
  36. 32                  m_lstCtrl_CpuUsage.SetItemText(i, 1, s);  
  37. 33                  pCpuS->bExit = false;       //此进程设为未退出状态  
  38. 34                  bFind = true;  
  39. 35                  break;  
  40. 36              }  
  41. 37          }  
  42. 38          if(!bFind)  
  43. 39          {  
  44. 40              //此进程是新开启进程,分配列表相关数据内存,插入到列表项中  
  45. 41              CPUUSEAGE_STRUCT *pCpuS = new CPUUSEAGE_STRUCT;  
  46. 42              pCpuS->pID = process32.th32ProcessID;  
  47. 43              int nInsert =m_lstCtrl_CpuUsage.GetItemCount();  
  48. 44              m_lstCtrl_CpuUsage.InsertItem(nInsert, process32.  
  49.                 szExeFile);插入进程名  
  50. 45              CString s;  
  51. 46              s.Format("%d",   
  52. 47              pCpuS->m_CpuUse.GetCpuUsage(process32.th32ProcessID));  
  53. 48              m_lstCtrl_CpuUsage.SetItemText(nInsert, 1, s);  
  54. 49              pCpuS->bExit = false;  
  55. 50              //插入进程CPU占用率  
  56. 51              m_lstCtrl_CpuUsage.SetItemData(nInsert, (DWORD)pCpuS);  
  57. 52          }  
  58. 53          bMore = ::Process32Next(hProcessSnap, &process32);   
  59.                                                 //遍历下一个进程  
  60. 54          }  
  61. 55      //清除进程快照句柄对象  
  62. 56      ::CloseHandle(hProcessSnap);  
  63. 57      for(i=0; i<m_lstCtrl_CpuUsage.GetItemCount(); i++)  
  64. 58      {  
  65. 59          //清除列表中已退出的进程  
  66. 60          DWORD itemData = m_lstCtrl_CpuUsage.GetItemData(i);  
  67. 61          CPUUSEAGE_STRUCT *pCpuS = (CPUUSEAGE_STRUCT *)itemData;  
  68. 62          if(pCpuS->bExit)  
  69. 63          {//进程列表状态已退出  
  70. 64              delete pCpuS;  
  71. 65              pCpuS = NULL;  
  72. 66              m_lstCtrl_CpuUsage.DeleteItem(i);   //删除此进程列表项  
  73. 67              i=0;  
  74. 68          }  
  75. 69      }  
  76. 70  }  

【代码解析】

CGetCpuUseageDlg:: Process()函数遍历进程快照,根据进程ID取得进程CPU占用率,刷新列表框显示。第4行调用CreateToolhelp32Snapshot()API函数取得进程快照。第19行调用Process32First()API函数取得第1个进程快照信息。第20~54行While循环遍历进程快照,Process32Next()API函数取得下一个进程信息,取得各进程CPU占用率,更新进程信息显示列表框。第56行关闭进程快照句柄。第57~68行清除列表框中已退出了的进程信息项。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇15.2.4 本地监控示例--各进程CPU.. 下一篇15.3.7 远程摄像头--创建监控方工..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: