SWT异常: Invalid thread access

来源:互联网 发布:图书馆数据库设计 编辑:程序博客网 时间:2024/05/17 23:58
SWT:程序中开启了一个线程,要改变界面,抛出: org.eclipse.swt.SWTException: Invalid thread access

在创建SWT界面的线程之外的线程中尝试去修改界面元素.将抛出以下异常

Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid thread access

at org.eclipse.swt.SWT.error(SWT.java:2942)

at org.eclipse.swt.SWT.error(SWT.java:2865)

at org.eclipse.swt.SWT.error(SWT.java:2836)

上述Thread-0是另外开启的一个线程.


解析:

在SWT程序中,

SWT会自动创建一个用户界面线程

非用户界面线程不能直接操作用户界面线程

要想在另外一个线程中尝试修改用户界面,应采用一下方法:

if (!this.display.isDisposed()) {

       Runnable runnable
= new Runnable() {

            
public void run() {

                  
// 你改界面的代码

             }

             };

       display.syncExec(runnable);
// 关键在这一句上

}

swt-doc中的说明:

public void syncExec(java.lang.Runnable runnable)
Causes the run() method of the runnable to be invoked by the user-interface thread at the next reasonable opportunity. The thread which calls this method is suspended until the runnable completes.
Parameters:
runnable - code to run on the user-interface thread.

此外,与之对应的另一个方法:

public void asyncExec(java.lang.Runnable runnable)
Causes the run() method of the runnable to be invoked by the user-interface thread at the next reasonable opportunity. The caller of this method continues to run in parallel, and is not notified when the runnable has completed.
Parameters:
runnable - code to run on the user-interface thread.

附例参考:

 public void loginComplete(MsnFriend own) {
    Display.getDefault().syncExec(new Runnable() {
    public void run() {

   //需要修改界面的代码
    allTxt.setText("登录成功....");
    }
    }); 
   }

 

 

注:转摘。感谢提供帮助给大家的所有朋友。

原创粉丝点击