2012-03-19 209 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