3

为安排和加入另一个 Eclipse 作业的 Eclipse 作业使用进度监视器的正确方法是什么?我希望子任务与主要任务相关联。

理想情况下,我希望能够告诉子任务使用SubProgressMonitor从主监视器创建的运行,但是我看不到这样做的方法。我查看了该Job.setProgressGroup(..., ...)方法,但文档表明该组应该使用IJobManager.createProgressGroup().

这是上下文的代码片段:

@Override
protected IStatus run(final IProgressMonitor monitor) {
    try {
        monitor.beginTask("My Job A", 100);

        MyJobB subtask = new MyJobB();

        // how how should subtask's progress be tracked?
        subtask.schedule();
        subtask.join();

        return Status.OK_STATUS;

    } catch (Exception ex) {
        // return error status
    } finally {
        monitor.done();                 
    }
}
4

1 回答 1

6

要回答原始问题 - 您可以这样做:

public class MyJobA extends Job {

    private IProgressMonitor pGroup = Job.getJobManager().createProgressGroup();

    public MyJobA() {
        super("My Job A");
        setProgressGroup(pGroup, 50);
    }

    @Override
    protected IStatus run(IProgressMonitor monitor) {
        MyJobB subtask = new MyJobB();
        subtask.setProgressGroup(pGroup, 50);

        pGroup.beginTask("My Jobs", 100);
        try {
            monitor.beginTask("My Job A", 10);
            try {
                // do work
                monitor.worked(...);
            } finally {
                monitor.done();
            }

            subtask.schedule();
            subtask.join();
        } finally {
            pGroup.done();
        }
        return Status.OK_STATUS;
    }
}

如果您在外部创建进度组,它会更优雅一点:

    IProgressMonitor group = Job.getJobManager().createProgressGroup();
    try {
        group.beginTask("My Tasks", 200);

        MyJobB b = new MyJobB();
        b.setProgressGroup(group, 100);
        b.schedule();

        MyJobC c = new MyJobC();
        c.setProgressGroup(group, 100);
        c.schedule();

        b.join();
        c.join();
    } finally {
        group.done();
    }

请注意,尚未计划的作业将显示为“已完成”:

进度视图

如果可能的话,我会考虑合并两个 Jobs 并使用SubMonitor

于 2013-01-31T22:37:34.367 回答