Приложение, которое я пишу, выполняет алгоритм длины, который обычно занимает несколько минут. За это время я хотел бы показать пользователю индикатор выполнения, который указывает, насколько алгоритм выполняется максимально точно.Шаблоны проектирования Progress Bar?
Алгоритм разделен на несколько этапов, каждый со своим собственным типичным временем. Для инициализации instance-
- (500 милли-сек)
- чтения входов (5 сек)
- шаг 1 (30 сек)
- шаг 2 (3 минуты)
- пишущие выходы (7 сек)
- выключая (10 милли-сек)
Каждый шаг может сообщить свой прогресс довольно легко, установив г ange работает, скажем [от 0 до 150], а затем сообщая о значении, которое оно завершило в своем основном цикле.
В настоящее время я настроил схему вложенных мониторов прогресса, которые образуют своего рода неявное дерево отчетов о прогрессе.
Все мониторы прогресса унаследован от интерфейса IProgressMonitor
:
class IProgressMonitor
{
public:
void setRange(int from, int to) = 0;
void setValue(int v) = 0;
};
Корень дерева является ProgressMonitor, который связан с фактическим графическим интерфейсом:
class GUIBarProgressMonitor : public IProgressMonitor
{
GUIBarProgressMonitor(ProgressBarWidget *);
};
Любой другой узел в дереве являются мониторами, которые контролируют кусок родительского хода:
class SubProgressMonitor : public IProgressMonitor
{
SubProgressMonitor(IProgressMonitor *parent, int parentFrom, int parentLength)
...
};
A SubProgressMonitor
получает контроль над диапазоном [parentFrom, parentFrom+parentLength]
его родителя.
С помощью этой схемы я могу статически делить ход верхнего уровня в соответствии с ожидаемой относительной частью каждого шага в глобальном времени. Затем каждый шаг можно подразделить на куски и т. Д.
Основным недостатком этого является то, что разделение является статическим, и становится болезненным вносить изменения в соответствии с переменными, которые обнаруживаются во время выполнения.
Итак, вопрос: есть ли какие-либо известные шаблоны проектирования для мониторинга прогресса, которые решают эту проблему?