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();
}
Обратите внимание, что задание, которое еще не запланировано, будет отображаться как "выполненное":
Если возможно, я бы рассмотрел слияние двух рабочих мест и использование SubMonitor.