Skip to main content
 首页 » 编程设计

design-patterns之进度条设计模式

2025年05月04日146exmyth

我正在编写的应用程序执行长度算法,通常需要几分钟才能完成。在这段时间里,我想向用户展示一个进度条,它指示尽可能精确地完成了多少算法。

该算法分为几个步骤,每个步骤都有自己的典型时序。例如-

  • 初始化(500 毫秒)
  • 读取输入(5 秒)
  • 第 1 步(30 秒)
  • 第 2 步(3 分钟)
  • 写入输出(7 秒)
  • 关机(10 毫秒)

  • 通过设置其工作范围,例如 [0 到 150],然后报告它在其主循环中完成的值,每个步骤都可以很容易地报告其进度。

    我目前建立的是一个嵌套的进度监视器方案,它形成了一种隐式的进度报告树。

    所有进度监视器都继承自一个接口(interface) IProgressMonitor :
    class IProgressMonitor 
    { 
    public: 
      void setRange(int from, int to) = 0; 
      void setValue(int v) = 0; 
    }; 
    

    树的根是 ProgressMonitor,它连接到实际的 GUI 界面:
    class GUIBarProgressMonitor : public IProgressMonitor 
    { 
       GUIBarProgressMonitor(ProgressBarWidget *); 
    }; 
    

    树中的任何其他节点都是监视器,它们控制父进程的一部分:
    class SubProgressMonitor : public IProgressMonitor 
    { 
      SubProgressMonitor(IProgressMonitor *parent, int parentFrom, int parentLength) 
      ... 
    }; 
    

    一个 SubProgressMonitor控制范围 [parentFrom, parentFrom+parentLength]它的 parent 。

    使用这个方案,我可以根据全局时序中每个步骤的预期相对部分静态划分顶级进度。然后可以将每个步骤进一步分割为碎片等'

    这样做的主要缺点是除法是静态的,根据运行时发现的变量进行更改会很痛苦。

    所以问题是:是否有任何已知的进度监控设计模式可以解决这个问题?

    请您参考如下方法:

    一个非常有趣的方法是用户感知。

    Chris Harrison发表了一篇关于用户如何根据进度条报告的进度感知时间流逝的论文(尽管在所有实验中实际持续时间显然是相同的)

    请注意,首选显示公式是 (x + (1-x)/2 )8 其中 x是 0 到 1 的实际进度 :)

    因此,我建议:

  • 收集一些关于给定任务花费时间百分比的统计数据
  • 测量初始化并用它来缩放进度条上的进度,悲观(例如准备一个 10-15% 的缓冲区)
  • 就在最后一个任务之前(或最后几个任务,只要它们具有确定的持续时间),全力以赴以及时完成进度条(渐进式加速)

  • 我知道,这不准确,但如果用户认为它更快,我会接受它!