将工作添加到Eclipse中的Job的进度监视器

时间:2009-07-10 07:28:05

标签: eclipse eclipse-rcp

我有一个在Eclipse中运行的工作(扩展org.eclipse.core.runtime.jobs.Job的类)。这份工作得到了一个IProgressMonitor,我用它来报告进展情况,这一切都很好。

这是我的问题:在处理过程中,我有时会发现有比我预期更多的工作。有时甚至加倍。但是,一旦我在进度监视器中设置了总滴答数,就无法更改此值。

关于如何克服这个问题的任何想法?

5 个答案:

答案 0 :(得分: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%跳到完成。

答案 1 :(得分:0)

使用进度监视器有eclipse.org article可能对您有所帮助。 AFAIK没有办法调整显示器中的刻度数,所以除非你做一个初始传递来猜测任务的相对大小并为每个部分分配刻度,否则你将跳转。

您可以将前10%分配给确定作业的大小,通常在完成之前无法执行此操作,因此您最终会在进度条上移动粘贴点。

答案 2 :(得分:0)

对我来说听起来像一个“回归监视器”: - )

假设您显示50%的进度,而您发现实际上只有25%,您打算做什么?回去?

也许您可以实现自己的IProgressMonitor来做到这一点,但我不确定您的用户的附加价值

答案 3 :(得分:0)

我认为你会发现问题比你想象的要抽象得多。你问的问题是真的"我有一份工作,我不知道它会花多长时间,我什么时候可以说我已经完成了一半?"答案是:你不能。进度条用于显示进度占整体的百分比。如果你不知道总数或百分比,那么进度条就不好玩了。

答案 4 :(得分:0)

将您的IProgressMonitor转换为SubMonitor,然后您可以随时调用SubMonitor.setWorkRemaining来重新分配剩余的滴答数。

SubMonitor的javadoc就是这个例子,展示如果您事先不知道滴答的总数,如何报告进度:

// 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;
      }
  }