Eclipse Progress View не обновляется при выполнении многих заданий - PullRequest
2 голосов
/ 14 марта 2012

У меня проблема с запуском большого количества одновременных заданий в моем Eclipse RCP приложении.Когда я запускаю 100 Jobs (как показано ниже), они выполняются нормально, но после их завершения они все еще видны в Progress View в течение примерно 10 секунд.Я бы хотел, чтобы Просмотр прогресса очистил Задания сразу после их завершения.Если я начну меньше Jobs (например, 10) Progress View сразу обновится.

class MyJob extends Job
{
    public MyJob(String name) {
        super(name);
    } 

    public IStatus run(IProgressMonitor monitor){
            //SOME EXPENSIVE COMPUTATIONS
        BigInteger bigint = new BigInteger("0");
        for ( int i=0 ; i<100 ; i++ ) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            bigint = bigint.add(new BigInteger(Integer.toString(i)));
        }
        monitor.done();

        System.out.println(new Random().nextInt());
        return new  Status(IStatus.OK, "foo", "OK");
    }
}

Ответы [ 2 ]

2 голосов
/ 01 февраля 2013

каждое задание запланировано как отдельный поток, и в случае, если их много, механизмы блокировки / синхронизации / управления потоками требуют некоторых затрат.для примера некоторый внутренний код Eclipse Jobs явно переводит механизм индикатора выполнения в режим ожидания на 250 мс.такие решения, вероятно, накапливаются с большими задержками.

в любом случае, если в Progress View есть 100 записей, это не для пользователя.Я бы предложил сгруппировать эти работы с Job.setProgressGroup().возможно, наличие меньшего количества записей в представлении сократит медленную отзывчивость.

0 голосов
/ 01 февраля 2013

В таком случае я бы сказал, что лучше выделять свои собственные потоки, чем использовать рабочие места.Ваши 100 заданий начнут использовать потоки заданий, которые будут использоваться для обслуживания Workbench.Выделение собственных потоков означает, что пул потоков заданий не вырастет до максимального значения и останется там.

У меня было бы одно задание, которое запускает ваши потоки и сообщает о прогрессе в представление прогресса.Вы можете использовать SubMonitor, чтобы разделить основной IProgressMonitor на 100, чтобы каждая из запущенных пар Thread / Runnable могла сообщать о ходе выполнения обратно в основное задание.

...