我正在尝试通过更改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();
    }
}

10-06 09:05