2012-03-19 4 views
0

Я получаю страшный ...Java - SWT - New работоспособной при нажатии кнопки отправки

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

Краткий обзор того, что я пытаюсь сделать:

У меня есть слушатель на Submit , я хотел бы начать новый поток из-за объема обработки, которое приложение будет делать с различными URL-адресами.

Это часть моего кода кнопки на Submit слушателя ...

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

Is UIMain() графический интерфейс? – Thomas

+0

Да, это SWT GUI-окно – Whnunlife

+0

Тогда ошибка в точности то, что она говорит. У вас уже есть один поток GUI (кнопка нажата), и вы создаете новый поток, который является графическим интерфейсом. Это явно запрещено с помощью swt. Ваш порожденный поток будет использовать Display.asyncExec() или syncExec() при работе с объектами gui. – Thomas

ответ

2

Вы не можете получить доступ к SWT UI прямо из отдельной нити. То, что вам нужно сделать, это выполнить асинхронный вызов из этого отдельного потока с помощью Display API.

Пример:

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

Хорошо, так это то же самое для простого чтения значений полей правильно? На данный момент я не пытаюсь обновить какие-либо элементы на SWT-дисплее, просто создайте новый поток, чтобы выполнить некоторую тяжелую обработку. – Whnunlife

+0

в соответствии с моим пониманием, вы никогда не должны обращаться к SWT-интерфейсу прямо из отдельного потока, неважно, есть ли для чтения или записи значения, так как SWT UI работает в своем потоке. Если вам просто нужны значения, чтобы начать тяжелый процесс, почему бы вам не инициализировать поток после получения значений из пользовательского интерфейса? –

+0

Хорошо, позвольте мне сделать это выстрел – Whnunlife