2012-03-19 175 views
0

我越来越可怕的新的可运行...爪哇 - SWT - 在点击提交按钮

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

的什么,我试图完成快速概述:

我有一个监听器提交按钮,我想开始一个新的线程,由于应用程序将处理各种url的处理量。

这是提交按钮收听我的代码部分...

submitButton.addSelectionListener(new SelectionAdapter() { 
      @Override 
      public void widgetSelected(SelectionEvent arg0) { 
       try { 
        // Check to see if http field is valid 
        httpValid = checkHttp(http); 
        if (httpValid) { 
         Thread t = new Thread(new UIMain(), "Controller Thread"); 
         t.start();  
        } else { 
         System.out.println("Not a Valid http"); 
        } 

       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
     }); 

这是我跑法...

public void run() { 
     options = new Options(); 
     setOptions(options); 
     Controller run = new Controller(options); 
    } 

错误点到线“setOptions(选项) “ 选项是一个对象,其中包含用户将输入的SWF字段中的一些数据。 setOptions非常直观,在该函数中,我从SWF字段收集数据,并将它们设置在对象中。

让我知道如果我需要张贴任何代码...的一些代码,我做的setOptions(选项)

例...

String url = http.getText(); 
options.addUrl(url); 

感谢,

+0

是UIMain()的GUI? – Thomas 2012-03-19 17:20:30

+0

是的,这是一个SWT GUI窗口 – Whnunlife 2012-03-19 17:21:20

+0

然后错误就是它说的。你已经有一个GUI线程(被按下的按钮),并且你正在产生一个新的线程,这是一个GUI窗口。这是swt明确不允许的。在处理gui对象时,你产生的线程必须使用Display.asyncExec()或syncExec()。 – Thomas 2012-03-19 17:28:55

回答

2

您无法直接从单独的线程访问SWT UI。您应该做的是使用Display API从该单独的线程执行异步调用。

实施例:

Display.getDefault().asyncExec(new Runnable() { 
    @Override 
    public void run() { 
     // access the SWT UI 
    } 
}); 
+0

好吧,所以这是相同的只读字段的值是正确的?截至目前,我并没有试图更新SWT显示中的任何元素,只是创建一个新线程来执行一些重要的处理。 – Whnunlife 2012-03-19 17:28:01

+0

根据我的理解,您不应该直接从单独的线程访问SWT UI,因为SWT UI在其自己的线程中运行时是否读取或写入值无关紧要。如果你只是需要这些值来开始一个沉重的过程,为什么你不需要从UI获取值之后初始化线程? – 2012-03-19 17:30:12

+0

好吧,让我给出一个镜头 – Whnunlife 2012-03-19 17:31:03