我正在编写的应用程序执行一个长度算法,通常需要几分钟才能完成。在此期间,我希望向用户显示进度条,尽可能精确地指示算法已完成多少部分。
该算法分为几个步骤,每个步骤都有自己的典型时间。例如:
- 初始化(500毫秒) - 读取输入(5秒) - 步骤1(30秒) - 步骤2(3分钟) - 写输出(7秒) - 关闭(10毫秒)
每个步骤可以通过设置其工作范围(例如[0到150])并报告其主循环中已完成的值来轻松报告其进度。
目前我设置了一个嵌套进度监视器的方案,形成了一种隐式的进度报告树。所有进度监视器都继承自接口IProgressMonitor。
该算法分为几个步骤,每个步骤都有自己的典型时间。例如:
- 初始化(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]
。
使用这种方案,我能够根据全局定时中每个步骤的预期相对部分静态地划分顶层进度。然后可以进一步将每个步骤细分为多个片段等。
这种方法的主要缺点是划分是静态的,并且根据在运行时发现的变量进行更改会很痛苦。
因此问题是:是否有任何已知的进度监视设计模式可以解决此问题?