Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在EclipseRCP中从长期运行的非UI作业更新/刷新进度视图_Eclipse_Multithreading_Jobs_Rcp - Fatal编程技术网

如何在EclipseRCP中从长期运行的非UI作业更新/刷新进度视图

如何在EclipseRCP中从长期运行的非UI作业更新/刷新进度视图,eclipse,multithreading,jobs,rcp,Eclipse,Multithreading,Jobs,Rcp,我有一个长期运行的非UI作业,其中包含许多子任务。每个子任务都会通过IProgressMonitor.subTasksome-caption更新进度视图中作业进度条目的标题。在通过Display.syncExec向第四个子任务中的UI贡献之前,作业要经历三个子任务,当然是通过创建一个新的IEditorPart实例。问题在于,这三个子任务从未反映在进度视图中作业的进度条目中。事实上,直到第四个子任务,作业进度条目才真正出现在进度视图中。当然,这给用户带来了一个问题,让他们怀疑是否有什么事情发生了。

我有一个长期运行的非UI作业,其中包含许多子任务。每个子任务都会通过IProgressMonitor.subTasksome-caption更新进度视图中作业进度条目的标题。在通过Display.syncExec向第四个子任务中的UI贡献之前,作业要经历三个子任务,当然是通过创建一个新的IEditorPart实例。问题在于,这三个子任务从未反映在进度视图中作业的进度条目中。事实上,直到第四个子任务,作业进度条目才真正出现在进度视图中。当然,这给用户带来了一个问题,让他们怀疑是否有什么事情发生了。我的猜测是,一旦作业开始,vm线程代理(抱歉,不熟悉这方面的知识)就永远不会有机会从非UI作业线程切换到UI线程,直到前者通过Display.syncExec实际调用后者。在这一点上,我唯一的解决方案是在每个子任务开始后让作业线程休眠大约半秒钟,从而允许UI线程占用足够长的时间来更新进度视图。虽然这在大多数情况下都是有效的,但我仍然不时会遇到这样的情况,即在第四个子任务之前,Porgress视图仍然是空的,这使我相信我的解决方案不是健壮的。因此,我正在寻找一个强大的。谢谢你抽出时间

编辑:示例代码

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();

你打电话给pm.beginTask*和pm.worked*了吗?我不使用后者,因为我使用pm.UNKNOWN作为前者的第二个参数。好吧,即使总数未知,你仍然可以使用pm.worked*。当你这样做的时候会发生什么?我试过了,但没有改变不想要的行为。似乎我需要一些东西来更好地控制子任务之间的线程。睡眠也许是个问题,但我不相信,除非有人在这方面有更丰富的知识来证实这一点。你可能是对的,如果你的子任务不能产生,UI线程可能永远无法得到控制。SyncExecutanable包含一个收益率。编辑示例是否像您预期的那样更新子任务?