Как настроить работу точно в IProgressMonitor в плагине Eclipse?
Метод org.eclipse.core.runtime.IProgressMonitor.worked(int)
получает целое число, которое означает приращение. Это означает, что единственными доступными единицами являются натуральные единицы. Это не может быть проценты, например.
Поэтому, если я обрабатываю некоторые файлы в работе, я не могу сообщить об этапе подсчета, потому что первый метод, который я должен вызвать, это org.eclipse.core.runtime.IProgressMonitor.beginTask(String, int)
что требует от меня знать общую сумму.
Как это сделать?
ОБНОВИТЬ
Я написал обертку ниже, но это выглядит абсурдно:
public class ProgressMonitorDoubleWrapper implements IProgressMonitor {
private IProgressMonitor delegate;
private int currentWork, totalWork;
private double currentWorkDouble;
public ProgressMonitorDoubleWrapper(IProgressMonitor monitor) {
this.delegate = monitor;
}
@Override
public void beginTask(String name, int totalWork) {
beginTask(name, (double) totalWork);
}
public void beginTask(String name, double totalWork) {
this.totalWork = (int) totalWork;
currentWork = 0;
currentWorkDouble = 0;
delegate.beginTask(name, this.totalWork);
}
@Override
public void done() {
delegate.done();
}
@Override
public void internalWorked(double work) {
delegate.internalWorked(work);
}
@Override
public boolean isCanceled() {
return delegate.isCanceled();
}
@Override
public void setCanceled(boolean value) {
delegate.setCanceled(value);
}
@Override
public void setTaskName(String name) {
delegate.setTaskName(name);
}
@Override
public void subTask(String name) {
delegate.subTask(name);
}
@Override
public void worked(int work) {
worked((double)work);
}
public void worked(double work) {
currentWorkDouble += work;
int increment = (int)(currentWorkDouble - (double)currentWork);
currentWork += increment;
delegate.worked(increment);
}
}
1 ответ
Я не видел хорошего решения для этого, что вы можете сделать одно из следующих действий:
Сделайте какое-нибудь быстрое сканирование, чтобы вычислить общее количество, если это возможно.
Вы можете указать IProgressMonitor.UNKNOWN
как значение на beginTask
Это дает вам другой индикатор выполнения, который просто показывает, что что-то происходит.
Просто угадать значение! Вероятно, что-то, что больше, чем общая стоимость работы, вероятно, получит.
Если произведение можно разбить на несколько частей, используйте SubProgressMonitor
для каждой части и укажите разумное количество работ для каждой части:
monitor.beginTask("task", 2 * 1000);
work1(new SubProgressMonitor(monitor, 1000));
work2(new SubProgressMonitor(monitor, 1000));