Как настроить работу точно в 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));
Другие вопросы по тегам