原因:在循环中频繁调用 SetPos()
方法更新进度条和AfxGetApp()->PumpMessage()
强制更新 UI 消息队列,会导致大量的 UI 重绘操作和 UI 消息处理。每次更新进度条,都会触发界面的重绘,这会占用相当多的 CPU 资源,尤其是在进度条更新频繁的时候。
解决办法:降低进度条的更新频率
可以按每处理一部分任务或一定百分比任务时,再更新UI
以每次处理总任务的20%作为UI的更新频次作为例子——
假如用于显示的进度条控件位于其他对话框,则需创建并显示进度对话框
CProgressDialog progressDialog;
progressDialog.Create(IDD_PROGRESS_DIALOG, this);
progressDialog.ShowWindow(SW_SHOW);
其中,CProgressDialog是进度对话框的类,IDD_PROGRESS_DIALOG是进度对话框的ID,对应自己的程序进行修改。
int total = Total_num;
int updateInterval = total / 5;
int progress = 0;
其中,Total_num是你的总任务数量,total / 5意味着每处理20%时进行更新UI。
for (int i = 0; i <Total_num; ++i)
{
// 处理任务
if (i % updateInterval == 0)
{
progress = static_cast<int>((i * 100.0) / total);
progressDialog.m_ProgressBar.SetPos(progress);
AfxGetApp()->PumpMessage();
}
}
// 处理完成后将进度条设置为 100%
progressDialog.m_ProgressBar.SetPos(100);
// 处理完成,关闭进度对话框
progressDialog.DestroyWindow();
上面表示了在某个循环中,每处理总任务量的20%时强制更新一次UI的绘图和消息队列,并在循环结束时达到100%进度。