Добавление работы в монитор прогресса задания в Eclipse - PullRequest
4 голосов
/ 10 июля 2009

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

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

Есть идеи, как преодолеть эту проблему?

Ответы [ 5 ]

5 голосов
/ 10 июля 2009

Посмотрите на 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% до завершения.

0 голосов
/ 17 марта 2015

Преобразуйте ваш 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;
      }
  }
0 голосов
/ 29 июня 2011

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

0 голосов
/ 11 ноября 2009

Для меня это звучит как "монитор регрессии": -)

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

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

0 голосов
/ 10 июля 2009

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

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

...