如何在UI-Thread之外获取ISelectionService

时间:2015-12-22 18:16:04

标签: eclipse multithreading eclipse-plugin

我正在尝试查找当前选定的项目/文件,到目前为止我找到的所有方法都使用ISelectionService。我发现获取它的实例的方式是:

 ISelectionService  selectionService = PlatformUI.getWorkbench()
         .getActiveWorkbenchWindow().getActivePage();

但不幸的是.getActiveWorkbenchWindow()返回null,因为我不在UI-Thread内。有没有什么好方法可以从UI-Thread外部获取ISelectionService?

2 个答案:

答案 0 :(得分:0)

您可以使用:

Display.getDefault().synchExec(runnable);

在UI线程中运行Runnable,您可以在其中获取选择服务。

然而,大多数UI代码都希望在UI线程中运行,因此您可能需要使用syncExecasyncExec来处理与UI有关的任何内容。

答案 1 :(得分:0)

很可能你是在关注错误的appraoch。您应该在运行非UI /后台线程之前>获取所选项目或文件

如果您的后台线程是由用户交互触发的,并且应该对所选资源(项目/文件)进行操作,那么当线程到达查询选择的点时,选择可能会发生变化。

相反,评估UI线程上的选择并将提取的资源作为参数传递给后台线程。

例如(简化代码):

// on the UI thread:
IResource resource = ( IResource )getSelectionService().getSelection().getFirstElement();
new Thread( new Runnable() {
  public void run() {
    resource.copy( ... ); /// or whatever should be done with the resource
  }
} ).start();