我正在尝试通过更改totalWork创建ProgressMonitor。
假设我有2个步骤。第一步是检索对象列表。 totalWork = -1(未知)。
在第二步中,我更改了lisl中的每个对象。所以我想将totalWork更改为列表的大小。我已经尝试过类似下面的代码,但没有成功:
int totalWork = -1
monitor.beginTask("Task", totalWork);
monitor.subTask("Start Subtask 1");
final List<Object> list = retrieveList();
totalWork = list.size();
monitor.subTask("Retrieve Events");
for(Object obj:list){
//do some job
monitor.worked(1)
}
monitor.done()
有办法实现吗?
编辑:我正在扩展Job,上面的代码在run方法中。
最佳答案
简短的回答:不!
更长的答案:
如果第一步花费的时间少于100毫秒(即使对于非常大的数据集),则通常在beginTask
之前完成...
在许多情况下,初始计数操作将花费与实际操作非常可比的时间。在这种情况下,您可以使用嵌入式SubProgressMonitor
。假设初始计数为后续操作的1/20:
public void run(IProgressMonitor monitor) {
monitor.beginTask("Task", 1+20);
try {
monitor.subTask("Initializing");
final List<Object> list = retrieveList();
monitor.worked(1);
IProgressMonitor sub = new SubProgressMonitor(monitor, 20);
sub.beginTask("", list.size());
for (Object o : list) {
sub.subTask(""+o);
// ...
sub.worked(1);
}
sub.done();
} finally {
monitor.done();
}
}