Приложение, которое я пишу, выполняет алгоритм длины, который обычно занимает несколько минут. В течение этого времени я хотел бы показать пользователю индикатор выполнения, который показывает, сколько алгоритма выполнено максимально точно.
Алгоритм разделен на несколько этапов, каждый из которых имеет свою собственную типичную синхронизацию. Например -
- инициализация (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)
...
};
A SubProgressMonitor
контролирует диапазон [parentFrom, parentFrom+parentLength]
своего родителя.
С помощью этой схемы я могу статически разделить прогресс на высшем уровне в соответствии с ожидаемой относительной частью каждого шага в глобальном времени. Затем каждый шаг можно разделить на части и т. Д.
Основным недостатком этого является то, что деление является статическим, и становится болезненно вносить изменения в соответствии с переменными, которые обнаруживаются во время выполнения.
Итак, вопрос: существуют ли какие-либо известные шаблоны проектирования для мониторинга прогресса, которые решают эту проблему?