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

相关推荐
BeyondESH28 分钟前
Linux线程同步—竞态条件和互斥锁(C语言)
linux·服务器·c++
豆浩宇37 分钟前
Halcon OCR检测 免训练版
c++·人工智能·opencv·算法·计算机视觉·ocr
WG_171 小时前
C++多态
开发语言·c++·面试
Charles Ray2 小时前
C++学习笔记 —— 内存分配 new
c++·笔记·学习
重生之我在20年代敲代码2 小时前
strncpy函数的使用和模拟实现
c语言·开发语言·c++·经验分享·笔记
迷迭所归处8 小时前
C++ —— 关于vector
开发语言·c++·算法
CV工程师小林8 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
white__ice9 小时前
2024.9.19
c++
天玑y9 小时前
算法设计与分析(背包问题
c++·经验分享·笔记·学习·算法·leetcode·蓝桥杯
姜太公钓鲸2339 小时前
c++ static(详解)
开发语言·c++