Eclipse Jobs API: как отслеживать ход выполнения задания, запланированного другим заданием?

Как правильно использовать мониторы прогресса для задания 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 ответ

Решение

Чтобы ответить на оригинальный вопрос - вы можете сделать это следующим образом:

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.

Другие вопросы по тегам