Посмотрите на SubMonitor .
void doSomething(IProgressMonitor monitor) {
// Convert the given monitor into a progress instance
SubMonitor progress = SubMonitor.convert(monitor, 100);
// Use 30% of the progress to do some work
doSomeWork(progress.newChild(30));
// Advance the monitor by another 30%
progress.worked(30);
// Use the remaining 40% of the progress to do some more work
doSomeWork(progress.newChild(40));
}
За исключением технических деталей, я бы так и сделал:
- Ваша обычная работа - 100;
- установить начальную работу 200;
- увеличивать работу по мере необходимости, если вы прогрессируете, предполагая, что общая работа должна быть равна 100;
- когда работа будет завершена, сообщите о ее завершении.
Это имеет следующие эффекты:
- на обычном рабочем элементе, который занимает 100 единиц, завершается очень быстро после 50% прогресса;
- для длинного рабочего элемента, он заканчивается с хорошим устойчивым прогрессом.
Это лучше, если завершить быстрее, чем ожидает пользователь, и, похоже, не застревать на долгое время.
Для бонусных баллов, если / когда обнаруживается, что потенциально длинная подзадача завершается достаточно быстро, все равно увеличивайте прогресс на большую величину. Это позволяет избежать скачка с 50% до завершения.