4 ответов:
Используйте Дисплей.Asyncexec или дисплей.syncExec , в зависимости от ваших потребностей.
Например, другой поток может вызвать этот метод для безопасного обновления метки:
private static void doUpdate(final Display display, final Label target, final String value) { display.asyncExec(new Runnable() { @Override public void run() { if (!target.isDisposed()) { target.setText(value); target.getParent().layout(); } } }); }
"SWT делает акцент на быстром отказе, когда речь заходит о проблемах с потоками; поэтому, по крайней мере, типичные проблемы не остаются незамеченными до производства. Вопрос, однако, в том, что вы делаете, если вам нужно обновить метку/кнопку/супер-пупер-контроль в SWT из фонового потока? Ну, это удивительно похоже на качели:"
// Code in background thread. doSomeExpensiveProcessing(); Display.getDefault().asyncExec(new Runnable() { public void run() { someSwtLabel.setText("Complete!"); } });
На самом деле вы можете просто отправить сообщение потоку GUI о том, что некоторые изменения были изменены. Это чище, если вы видите его с точки зрения MVC.
При создании отдельного потока из основного потока передайте объект Gui новому потоку, и u сможет получить доступ ко всем свойствам этого объекта GUI.
Comments