Eclipse Jobs API:如何跟踪另一个作业安排的作业进度?

时间:2013-01-25 20:53:16

标签: eclipse-plugin progress jobs progressmonitor

对于在另一个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();                 
    }
}

1 个答案:

答案 0 :(得分: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();
    }

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

ProgressView

如果可能,我会考虑合并两个作业并使用SubMonitor