Я думаю, что важно, чтобы ваш основной индикатор прогресса заполнялся ровно один раз, и всегда есть индикация прогресса.
Я только недавно сделал что-то очень похожее на работе. Задачи были долгими, со многими подзадачами. Интерфейс, с которым я закончил, был двойным индикатором выполнения, который был фактически первым и последним из стека индикаторов.
API это что-то вроде
StartNewTask(Caption,NumberOfSubtasks)
EndTask
SetProgress(Caption,NumberOfSubtasksFinished)
StartNewTask
помещает новый бар в стек, а EndTask
выводит один.
SetProgress устанавливает ход выполнения последней нажатой строки прогресса и выводит изменения в родительские полосы. Например:
StartNewTask('Doing 2 things',2)
SetProgress('Done 1 now',1)
StartNewTask('Big Subtask',40)
...
SetProgress('Done some subtasks',10)
Теперь показаны 2 индикатора выполнения, второй с 25% (10/40) и первый с 62,5% (1/2 + 10/40 * 2)
Как я уже говорил выше, если у вас> 2 задачи в стеке, я показываю только первое и последнее (первое дает общий прогресс и никогда не идет назад, второе показывает текущую активность)
Вы можете расширить это, задав вес каждой подзадаче, т.е.
StartNewTask(Caption,[ListOfSubTaskWeightings])
Чтобы сделать верхний индикатор выполнения более плавным.
Кроме того, разработчики могут показывать все индикаторы выполнения, чтобы понять, почему на это уходит много времени, и я думаю, что из этого можно сделать приличные логи.