15.2.4 本地监控示例--各进程CPU占用率(3)
(7)在GetCpuUseageDlg.cpp的OnInitDialog()函数中添加如下代码,实现为列表控件加入两个列,然后启动定时器。
- 01 BOOL CGetCpuUseageDlg:: OnInitDialog()
- 02 {
- 03 m_lstCtrl_CpuUsage.InsertColumn(0, "进程名称", LVCFMT_LEFT, 160);
- 04 m_lstCtrl_CpuUsage.InsertColumn(1, "CPU占用", LVCFMT_LEFT, 160);
- 05 this->SetTimer(GETCPUTIMER, 1000, NULL);
- //开启定时器,每秒取CPU占用率1次
- 06 }
(8)为CGetCpuUseageDlg类添加WM_TIMER和WM_CLOSE消息,并在消息处理函数中添加如下代码:- 01 void CGetCpuUseageDlg::OnTimer(UINT nIDEvent)
- 02 {
- 03 Process();
- 04 CDialog::OnTimer(nIDEvent);
- 05 }
- 06 void CGetCpuUseageDlg::OnClose()
- 07 {
- 08 // TODO: Add your message handler code here and/or call default
- 09 KillTimer(GETCPUTIMER); //关闭定时器
- 10 //释放内存空间
- 11 int i=0;
- 12 for(i=0; i<m_lstCtrl_CpuUsage.GetItemCount(); i++)
- 13 {//程序退出时,释放和每个列表项相关的数据内存
- 14 DWORD itemData = m_lstCtrl_CpuUsage.GetItemData(i);
- //得到列表索引的数据
- 15 CPUUSEAGE_STRUCT *pCpuS = (CPUUSEAGE_STRUCT *)itemData;
- 16 delete pCpuS;
- 17 pCpuS = NULL;
- 18 }
- 19 CDialog::OnClose();
- 20 }
【代码解析】
CGetCpuUseageDlg::OnTimer()函数定时调用Process()函数获取进程信息,更新列表框进程占用CPU信息项。第9行当程序退出时关闭定时器。第11~18行释放程序分配存储进程相关信息的内存块。
注意:程序退出时应释放程序中分配的内存块,以免内存泄漏。
进程CPU占用率实例的运行结果如图15.7所示。
|
| 图15.7 各进程CPU占用率运行结果 |
本例通过封装好的CCpuUsage类来获取每个进程的CPU占用率。首先使用Timer消息,每秒一次地获取每个进程占用CPU率,然后刷新列表,为保证刷新时列表的显示不闪烁,采用了列表控件中每项外带自定义数据的方式实现。