进度条设计模式?

sho*_*osh 18 oop design-patterns progress-bar

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

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

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

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

我目前设置的是嵌套进度监视器的方案,它构成了一种隐含的进度报告树.

所有进度监视器都从接口继承IProgressMonitor:

class IProgressMonitor
{
public:
  void setRange(int from, int to) = 0;
  void setValue(int v) = 0;
};
Run Code Online (Sandbox Code Playgroud)

树的根是ProgressMonitor,它连接到实际的GUI界面:

class GUIBarProgressMonitor : public IProgressMonitor
{
   GUIBarProgressMonitor(ProgressBarWidget *);
};
Run Code Online (Sandbox Code Playgroud)

树中的任何其他节点都是监视器,它控制父进程的一部分:

class SubProgressMonitor : public IProgressMonitor
{
  SubProgressMonitor(IProgressMonitor *parent, int parentFrom, int parentLength)
  ...
};
Run Code Online (Sandbox Code Playgroud)

A SubProgressMonitor控制[parentFrom, parentFrom+parentLength]其父级的范围.

通过这种方案,我能够根据全局时间中每个步骤的预期相对部分静态地划分顶级进度.然后,每个步骤可以进一步细分为等等'

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

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

Mat*_* M. 5

一种非常有趣的方法是用户感知.

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

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

因此,我建议:

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

我知道,这不准确,但如果用户认为它更快,我会满足于此!


Pét*_*rök 1

这是一个棘手的问题,我们在之前的项目中也遇到过这个问题。

我能想到的最好办法是收集现实生活中每个阶段实际花费多长时间的统计数据,并相应地调整相对间隔长度。

不过,我们还没有在那个项目中实现它(至少在我在那里的时候),所以这只是一个理论想法:-)