MFC在循环中添加进度条控件后运行速度显著变慢

原因 :在循环中频繁调用 SetPos() 方法更新进度条和AfxGetApp()->PumpMessage()强制更新 UI 消息队列,会导致大量的 UI 重绘操作和 UI 消息处理。每次更新进度条,都会触发界面的重绘,这会占用相当多的 CPU 资源,尤其是在进度条更新频繁的时候。

解决办法降低进度条的更新频率
可以按每处理一部分任务或一定百分比任务时,再更新UI

以每次处理总任务的20%作为UI的更新频次作为例子------
假如用于显示的进度条控件位于其他对话框,则需创建并显示进度对话框

c 复制代码
    CProgressDialog progressDialog;
    progressDialog.Create(IDD_PROGRESS_DIALOG, this);
    progressDialog.ShowWindow(SW_SHOW);

其中,CProgressDialog是进度对话框的类,IDD_PROGRESS_DIALOG是进度对话框的ID,对应自己的程序进行修改。

c 复制代码
    int total = Total_num; 
    int updateInterval = total / 5; 
    int progress = 0;

其中,Total_num是你的总任务数量,total / 5意味着每处理20%时进行更新UI。

c 复制代码
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%进度。

相关推荐
郝学胜-神的一滴2 小时前
中级OpenGL教程 013:渲染器类架构设计与逐帧渲染流程详解
开发语言·c++·unity·游戏引擎·图形渲染·opengl·unreal
小小龙学IT3 小时前
C++ 并发编程深度解析:从内存模型到无锁数据结构
数据结构·c++
凯瑟琳.奥古斯特4 小时前
力扣1013三等分解法与C++实现
开发语言·c++·算法·leetcode·职场和发展
一拳一个呆瓜4 小时前
【STL】iostream 编程:缓冲区的作用
c++·stl
我不是懒洋洋4 小时前
从零实现一个分布式任务调度器:XXL-JOB的核心设计
c++
凯瑟琳.奥古斯特5 小时前
力扣1012数位DP解法详解
开发语言·c++·算法·leetcode·职场和发展
chh5636 小时前
C++--string
java·开发语言·网络·c++·学习
J_yyy6 小时前
基于Reactor的文件管理服务开发笔记
c++·笔记·reactor·多线程编程·muduo
李小小钦7 小时前
D. Storming Arasaka(Codeforces 2238)
c语言·开发语言·数据结构·c++·算法