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