Добавление работы в монитор прогресса задания в Eclipse

У меня есть работа (класс, который расширяет org.eclipse.core.runtime.jobs.Job), работающая внутри Eclipse. Задание получает IProgressMonitor, и я использую его, чтобы сообщать о ходе выполнения, все в порядке.

Вот моя проблема: во время обработки я иногда обнаруживаю, что работы больше, чем я ожидал. Иногда даже вдвое. Однако, как только я установил общее количество тиков в мониторе выполнения, изменить это значение невозможно.

Любые идеи о том, как преодолеть эту проблему?


person zvikico    schedule 10.07.2009    source источник


Ответы (5)


Взгляните на 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% до полного.

person Robert Munteanu    schedule 10.07.2009
comment
Я знаком с этим, и это нехорошо. Это помогает только в том случае, если вы заранее знаете, что вам потребуется больше работы. Я не иначе, я мог бы просто поставить более высокую галочку в первую очередь. Если работы больше нет, первые 30% будут ползать, а следующие просто летать. Это не очень хороший пользовательский опыт. - person zvikico; 10.07.2009
comment
Это действительно помогает, если вы сначала выполняете наиболее трудоемкий объем работы. - person Robert Munteanu; 10.07.2009
comment
Опять же, это означает, что вам нужно знать, что будет больше работы и что она будет меньше первоначальной работы. - person zvikico; 10.07.2009
comment
Как я сказал в своем ответе, я думаю, что это неизбежно, если в начале процесса неизвестно, сколько работы потребуется. Понижение кажется резким - person Rich Seller; 10.07.2009
comment
Извините, но этот ответ не имеет отношения к моему вопросу. Ваш ответ говорит, что это неизбежно, и это что-то еще. - person zvikico; 10.07.2009

Существует статья eclipse.org об использовании мониторов прогресса. это может помочь вам в целом. Насколько я знаю, нет способа изменить количество тиков в мониторе, поэтому, если вы не сделаете начальный проход, чтобы угадать относительный размер задач и назначить тики каждой части, вы получите скачки.

Вы можете выделить первые 10% для определения размера работы, хотя часто вы не можете сделать это, пока не закончите, так что в конечном итоге вы просто сдвинете мертвую точку на индикаторе выполнения.

person Rich Seller    schedule 10.07.2009
comment
На данный момент я нашел как минимум два обходных пути, ни один из них не идеален, но оба работают: 1. Создайте новое задание с новым монитором. 2. замедлить выполнение моей текущей работы, если я узнаю, что предстоит еще работа. - person zvikico; 10.07.2009

Звучит как «регресс-монитор» для меня :-)

Допустим, вы показываете 50% прогресса, а обнаруживаете, что на самом деле только 25%, что вы собираетесь делать? Вернитесь?

Возможно, вы можете реализовать свой собственный IProgressMonitor для этого, но я не уверен в дополнительной ценности для вашего пользователя.

person Alexandre Pauzies    schedule 11.11.2009

Я думаю, вы обнаружите, что проблема немного более абстрактна, чем вы думаете. Вопрос, который вы задаете, на самом деле звучит так: «У меня есть работа, которую я не знаю, сколько времени она займет, когда я могу сказать, что я наполовину сделан?» Ответ: Вы не можете. Индикаторы выполнения предназначены для отображения прогресса в процентах от общего числа. Если вы не знаете общее количество или процент, то индикатор выполнения неинтересен.

person Eng    schedule 29.06.2011

Преобразуйте свой IProgressMonitor в SubMonitor, после чего вы сможете в любой момент вызвать SubMonitor.setWorkRemaining, чтобы перераспределить оставшееся количество тиков.

В javadoc для SubMonitor есть этот пример, демонстрирующий, как сообщать о прогрессе, если вы заранее не знаете общее количество тиков:

// This example demonstrates how to report logarithmic progress in 
// situations where the number of ticks cannot be easily computed in advance.

  void doSomething(IProgressMonitor monitor, LinkedListNode node) {
      SubMonitor progress = SubMonitor.convert(monitor);

      while (node != null) {
          // Regardless of the amount of progress reported so far,
          // use 0.01% of the space remaining in the monitor to process the next node.
          progress.setWorkRemaining(10000);

          doWorkOnElement(node, progress.newChild(1));

          node = node.next;
      }
  }
person Stefan    schedule 17.03.2015