4

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

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

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

4

5 回答 5

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% 到完成的跳跃。

于 2009-07-10T07:39:59.980 回答
0

Convert your IProgressMonitor to a SubMonitor, then you can call SubMonitor.setWorkRemaining at any time to redistribute the remaining number of ticks.

The javadoc for SubMonitor has this example demonstrating how to report progress if you don't know the total number of ticks in advance:

// 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;
      }
  }
于 2015-03-17T08:26:46.180 回答
0

eclipse.org上有一篇关于使用进度监视器的文章,总体上可能会对您有所帮助。AFAIK 无法调整监视器中的刻度数,因此除非您进行初始传递以猜测任务的相对大小并将刻度分配给每个部分,否则您将获得跳跃。

您可以将前 10% 分配给确定工作的大小,但通常在完成之前您不能这样做,因此您最终只是转移了进度条上的症结点。

于 2009-07-10T09:24:16.667 回答
0

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

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

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

于 2009-11-11T05:09:39.660 回答
0

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

于 2011-06-29T14:10:12.987 回答