我有一个在 Eclipse 中运行的工作(扩展 org.eclipse.core.runtime.jobs.Job 的类)。这项工作获得了 IProgressMonitor,我正在使用它来报告进度,这一切都很好。
这是我的问题:在处理过程中,我有时会发现工作量超出了我的预期。有时甚至翻倍。但是,一旦我在进度监视器中设置了总滴答数,就无法更改此值。
关于如何克服这个问题的任何想法?
我有一个在 Eclipse 中运行的工作(扩展 org.eclipse.core.runtime.jobs.Job 的类)。这项工作获得了 IProgressMonitor,我正在使用它来报告进度,这一切都很好。
这是我的问题:在处理过程中,我有时会发现工作量超出了我的预期。有时甚至翻倍。但是,一旦我在进度监视器中设置了总滴答数,就无法更改此值。
关于如何克服这个问题的任何想法?
看看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));
}
除了技术细节,我会这样做:
这具有以下效果:
这比用户预期的更快完成更好,并且似乎不会长时间卡住。
对于奖励积分,如果/当检测到可能较长的子任务足够快地完成时,仍会大幅增加进度。这避免了从 50% 到完成的跳跃。
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;
}
}
eclipse.org上有一篇关于使用进度监视器的文章,总体上可能会对您有所帮助。AFAIK 无法调整监视器中的刻度数,因此除非您进行初始传递以猜测任务的相对大小并将刻度分配给每个部分,否则您将获得跳跃。
您可以将前 10% 分配给确定工作的大小,但通常在完成之前您不能这样做,因此您最终只是转移了进度条上的症结点。
对我来说听起来像是一个“回归监视器”:-)
假设您显示了 50% 的进度,而您发现您实际上只有 25%,您打算怎么做?回去?
也许您可以实现自己的 IProgressMonitor 来做到这一点,但我不确定为您的用户带来的附加值
我想你会发现这个问题比你想象的要抽象一点。您要问的问题实际上是“我有一份工作,我不知道要花多长时间,我什么时候可以说我已经完成了一半?” 答案:你不能。进度条用于显示进度占整体的百分比。如果您不知道总数或百分比,那么进度条就不好玩了。