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

相关推荐
xiaolang_8616_wjl1 小时前
c++文字游戏_闯关打怪2.0(开源)
开发语言·c++·开源
夜月yeyue1 小时前
设计模式分析
linux·c++·stm32·单片机·嵌入式硬件
无小道2 小时前
c++-引用(包括完美转发,移动构造,万能引用)
c语言·开发语言·汇编·c++
FirstFrost --sy4 小时前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先
Tanecious.4 小时前
C++--map和set的使用
开发语言·c++
Yingye Zhu(HPXXZYY)4 小时前
Codeforces 2021 C Those Who Are With Us
数据结构·c++·算法
liulilittle5 小时前
LinkedList 链表数据结构实现 (OPENPPP2)
开发语言·数据结构·c++·链表
无聊的小坏坏6 小时前
三种方法详解最长回文子串问题
c++·算法·回文串
山河木马6 小时前
前端学习C++之:.h(.hpp)与.cpp文件
前端·javascript·c++
2401_891957316 小时前
list的一些特性(C++)
开发语言·c++