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%进度。

相关推荐
eggwyw4 分钟前
关于C++为什么不加入垃圾回收机制解析
开发语言·c++
曦樂~10 小时前
Cpp面筋
c语言·c++
道尔柯南10 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
十二13 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
D e re k ZH15 小时前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
zjxtxdy17 小时前
C++面向对象程序开发-类与对象
开发语言·c++
東隅已逝,桑榆非晚18 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法
qq_4069810319 小时前
c++拷贝构造函数
开发语言·c++
H.莓飛21 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla21 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法