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