美文网首页
org.eclipse.swt.SWTException: In

org.eclipse.swt.SWTException: In

作者: lyu571 | 来源:发表于2017-06-02 11:48 被阅读0次

    SWTException在Eclipse插件开发中是比较常见的异常,初遇之时,比较头疼,现将解决办法总结一下。

    RootCause

    Eclipse是基于SWT框架的。SWT实现了一个被称为单元线程(apartment threading)的UI模型,SWT严格要求UI操作只能由UI线程调用,如果用户企图在非UI线程中访问SWT组件,就会收到“org.eclipse.swt.SWTException: Invalid thread access”异常。

    解决方案

    SWT为了兼顾非UI线程中对UI组件的访问,提供了以下两种方式(也是唯一的两种方式):

    • syncExec(Runnable runnable)
      这样导致非UI线程等待runnable完成

    • asyncExec(Runnable runnable)
      允许非UI线程继续执行而非等待runnable完成

      display.syncExec(
        new Runnable() {
        public void run(){
          label.setText(text);
        }
      });
      
    举例

    比如,在某个线程的回调方法中,需要弹出对话框提示用户,可以这样做:

    public void callback() {
    
        Display.getDefault().syncExec(new Runnable() {
            @Override
            public void run() {
                MessageDialog.openError(getShell(),
                        "title","Error!");
            }
        });
    }
    

    这里使用的是同步调用,当然还有异步方式可用,但SWT推荐使用前者,因为这样更接近java方法调用(即获得结果前总是等待method执行完毕)。

    此外,Display还有个getCurrent()可用,实际编码时可根据情况选择之。

    Reference

    The SWT FAQ

    (end)

    相关文章

      网友评论

          本文标题:org.eclipse.swt.SWTException: In

          本文链接:https://www.haomeiwen.com/subject/sisefxtx.html