【发布时间】:2010-03-24 09:35:22
【问题描述】:
我正在编写的应用程序执行长度算法,通常需要几分钟才能完成。在此期间,我想向用户显示一个进度条,它会尽可能精确地指示算法完成了多少。
该算法分为几个步骤,每个步骤都有自己的典型时序。例如 -
- 初始化(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] 范围。
使用此方案,我可以根据全局时序中每个步骤的预期相对部分静态划分顶级进度。然后可以将每个步骤进一步细分为碎片等'
这样做的主要缺点是除法是静态的,根据运行时发现的变量进行更改会很痛苦。
那么问题是:是否有任何已知的进度监控设计模式可以解决这个问题?
【问题讨论】:
标签: design-patterns oop progress-bar