如何在eclipse rcp中从长时间运行的非UI作业更新/刷新Progress View

时间:2012-03-03 19:31:02

标签: eclipse multithreading jobs rcp

我有一个长期运行的非UI作业,其中包含许多子任务。每个子任务通过IProgressMonitor.subTask(some-caption)更新进度视图中作业进度条目的标题。 Job通过创建新的IEditorPart实例,在它的第四个子任务(当然是通过Display.syncExec())为UI做出贡献之前,经过三个子任务。 问题是这些最初的三个子任务永远不会反映在进度视图中的作业进度条目中。事实上,作业进度条目从未实际出现在进度视图中,直到第四个子任务。这当然会给那些想知道是否有任何事情发生的用户带来问题。我的猜测是,一旦Job启动,vm线程“broker”(抱歉,不熟悉这个问题)永远不会有机会从非UI作业线程切换到UI线程,直到前者实际调用后者通过Display.syncExec()。此时我唯一的解决方案是在每个子任务启动后立即让Job线程休眠大约半秒,从而允许UI线程接管足够长的时间来更新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();

0 个答案:

没有答案