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

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


初始化(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;
};


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

class GUIBarProgressMonitor : public IProgressMonitor
{
   GUIBarProgressMonitor(ProgressBarWidget *);
};


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

class SubProgressMonitor : public IProgressMonitor
{
  SubProgressMonitor(IProgressMonitor *parent, int parentFrom, int parentLength)
  ...
};


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

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

这样做的主要缺点是除法是静态的,并且根据运行时发现的变量进行更改非常麻烦。

那么问题来了:是否有任何已知的进度监控设计模式可以解决此问题?

最佳答案

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

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

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

因此,我建议:


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


我知道,这是不准确的,但是如果用户认为速度更快,我会接受的!

07-24 09:48
查看更多