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

相关推荐
蒸蒸yyyyzwd12 分钟前
后端学习笔记 day58
c++·八股
道尔柯南14 分钟前
【QT】从零认识 Qt:跨平台 C++ GUI 开发入门
开发语言·c++·qt
MayZork39 分钟前
std::filesystem 文件操作详解
开发语言·c++·qt
NeilYuen12 小时前
【C++】STL源码仿写(二):vector
开发语言·c++
郝学胜_神的一滴13 小时前
游戏引擎原理与实践 04:拆解引擎基础系统与内存管理
c++·游戏
All for pursuit.13 小时前
【设计-1】208.实现Trie (前缀树)
数据结构·c++·算法·leetcode
weixin_3077791314 小时前
C++代码实现MATLAB中的crossval函数功能
开发语言·c++·算法·matlab
青少儿编程课堂14 小时前
背包问题(0/1 背包与完全背包)解题精讲——动态规划入门
c++·python·算法·bfs·信息学竞赛
倒头就睡的小比特14 小时前
C++多态
c++
潼心1412o16 小时前
C++初阶(长期更新)第5讲:类和对象(中)
开发语言·c++