Как обновить / обновить Progress View из длительной работы без пользовательского интерфейса в eclipse rcp - PullRequest
1 голос
/ 03 марта 2012

У меня есть длительное задание без пользовательского интерфейса со множеством подзадач.каждая подзадача обновляет заголовок для записи о ходе выполнения задания в представлении хода выполнения с помощью IProgressMonitor.subTask (some-caption).Задание проходит три подзадачи, прежде чем оно вносит свой вклад в пользовательский интерфейс в своей четвертой подзадаче (конечно, через Display.syncExec ()) путем создания нового экземпляра IEditorPart. проблема в том, что эти первые три подзадачи никогда не отражаются в записи о ходе выполнения задания в представлении хода выполнения.на самом деле, запись о выполнении задания фактически никогда не появляется в представлении хода выполнения до четвертой подзадачи. это, конечно, создает проблему для пользователя, который остается задаться вопросом, происходит ли что-либо вообще.Я предполагаю, что, как только задание запускается, поток "посредник" vm (извините, не очень хорошо разбирается в этом вопросе) никогда не получает возможности переключиться с потока задания, не относящегося к пользовательскому интерфейсу, на поток пользовательского интерфейса, пока первый фактически не вызоветпоследний через Display.syncExec ().На данный момент мое единственное решение - перевести поток Job в спящий режим примерно на полсекунды сразу после запуска каждой подзадачи, тем самым позволяя потоку пользовательского интерфейса занять достаточно много времени для обновления Progress View.и хотя это работало большую часть времени, я все еще получаю случаи, когда Porgress View остается пустым до четвертой подзадачи, что наводит меня на мысль, что мое решение не является надежным.следовательно, я ищу надежный.спасибо за ваше время!

РЕДАКТИРОВАТЬ: пример кода

Job job = new Job("multipleTasks") {
    public IStatus run(IProgressMonitor monitor) {
        monitor.beginTask("multiple tasks", IProgressMonitor.UNKNOWN);
        monitor.subTask("task1");
        monitor.worked(1);
        try { Thread.sleep(1000); } catch (Exception e) { }
        monitor.subTask("task2");
        monitor.worked(1);
        try { Thread.sleep(1000); } catch (Exception e) { }
        monitor.subTask("task3");
        monitor.worked(1);
        try { Thread.sleep(1000); } catch (Exception e) { }
        monitor.done();
        return Status.OK_STATUS;
    }
};
job.schedule();
...