你怎么能得到一个" SWTException:无效的线程访问"这里?

时间:2012-09-19 17:21:03

标签: java eclipse swt eclipse-rcp jface

我正在plugin.xml注册一个生命周期监听器。如果我只定义一个Shell,它就可以运行了 例如

@PostContextCreate  
void postContextCreate(final IEventBroker eventBroker){  
     System.out.println("CALLED!");    
     final Shell shell = new Shell(SWT.TOOL | SWT.NO_TRIM);  
     shell.open();  
     eventBroker.subscribe(UIEvents.UILifeCycle.ACTIVATE, new EventHandler() {  

    @Override  
    public void handleEvent(Event event) {  
        System.out.println("Closing shell");  
        shell.close();  
        shell.dispose();  
        System.out.println("Closed");  
        eventBroker.unsubscribe(this);  
        }
     });

但如果我将呼叫更改为也使用Display

@PostContextCreate
void postContextCreate(final IEventBroker eventBroker){  
    System.out.println("CALLED!");  
    Display display = new Display();  
    final Shell shell = createSplashShell(display);  
    shell.open();  
    while (!shell.isDisposed ()) {  
    if (!display .readAndDispatch ()) display.sleep ();  
    }
    display.dispose ();  
   //etc  

我得到以下异常:

  

org.eclipse.e4.core.di.InjectionException:   org.eclipse.swt.SWTException:无效的线程访问权限   org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:63)     在
  org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:229)     在   org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:206)     在

我知道此异常必须对UI线程执行某些操作,但我无法弄清楚如何在此处使用Display导致此异常。
有什么帮助吗?

2 个答案:

答案 0 :(得分:5)

使用Display.asyncExec方法在UI线程上执行Runnable。

与大多数UI框架一样,SWT不允许任何线程对UI组件起作用,因此当您从另一个线程更改某些内容时,必须将其提供给在UI线程上执行它的此实用程序。

答案 1 :(得分:4)

根据我的理解,我发现你想在事件发生时弹出一个shell。 一个显示(由主RCP应用程序创建)足以创建新的shell和处理事件。

@PostContextCreate
    void postContextCreate(final IEventBroker eventBroker){  
        System.out.println("CALLED!");

        final Display display = Display.getDefault();
        Display.getDefault().asyncExec(new Runnable()
        {
          public void run()
        { 
         final Shell shell = createSplashShell(display);  
         shell.open();  
         while (!shell.isDisposed ()) {  
         if (!display .readAndDispatch ()) display.sleep ();  
        }
      }
    }