0

警告:在 Eclipse 插件开发中,我仍在努力使用正确的 MVC,所以如果您在这里看到任何最有可能导致我应该忍受的更多痛苦的东西,请告诉我。

问题:

我有一个带有 JFace 树查看器和一个表格的视图(不是表格查看器......这将在路上改变)。

我有一个使用 View 引用初始化的操作(这对我来说似乎很糟糕,但我还不知道如何以正确的方式进行操作)。当动作运行时——通过视图上的按钮——动作:1)从视图中获取树查看器 2)获取底层模型 3)在作业中创建作业 a)在作业中循环并执行各种各样的事情,包括在模型中添加额外的孩子 b) 使用视图中公开的函数来“清除”视图中的表 4) 添加一个实现“done()”的 JobChangeListener。a) 在 done() 方法中,它通过以下代码扩展 treeviewer:

loadMethodsJob.addJobChangeListener(new JobChangeAdapter(){
        public void done(IJobChangeEvent event){
            view.enableActions();
            view.getTestsViewer().expandAll();
        }
    });

在 Job 内部,每当我尝试访问查看器中的元素时,都会收到 Invalid Thread Access 错误。我相信我理解为什么我在工作中运行时得到它们,但是如果我无法与工作更改侦听器中的小部件交互,我不确定如何正确解决它们。如果我将与小部件的每次交互都包装在 getDisplay().synchExec(....) 中,我可以让它工作,但我似乎记得读过这不是可取的。

我觉得我在理解 Eclipse SWT 方面正处于一个巨大飞跃的风口浪尖,所以我很感激任何指导。

4

1 回答 1

1

SWT 中的任何 UI 组件都只能由 UI 线程访问。

由于作业的 done 方法在单独的非 UI 线程中运行,因此会触发无效线程访问。

通过将每个交互包装在 a 中Display.syncExec,您可以确保它在显示线程(UI 线程)中运行。

上述方法应该没有任何问题。

于 2010-05-18T09:24:42.107 回答