У меня есть приложение eclipse rcp. И у меня есть команда, когда эта команда выполняется. Мне нужно начать поток. После выполнения этого потока GUI должен быть обновлен. Но я полагаю, что этот поток или другой поток не-SWT не может обновить GUI. Но это кажется разумным. Когда я пытался это сделать, я получил Exception in thread "Thread-5" org.eclipse.swt.SWTException: Invalid thread access
. Как я могу сделать эту задачу?Eclipse RCP многопоточность
ответ
С помощью SWT вам необходимо иметь что-либо, что обновляет графический интерфейс в основном потоке, или в Eclipse, это называется потоком пользовательского интерфейса (это тот же поток). Вы получаете эту ошибку, потому что пытаетесь получить доступ к SWT-объекту в другом потоке. Рассмотрите возможность использования Display.syncExec()
или Display.asyncExec()
, чтобы переместить обработку, связанную с SWT, в основную нить. Вы хотите быть осторожным с syncExec()
, что вы не вызываете тупик.
В зависимости от того, что вам нужно сделать в фоновом режиме, вы, вероятно, захотите ознакомиться с API-интерфейсом Eclipse Jobs, который обеспечивает поддержку для запуска фоновых задач и предоставления обратной связи пользователю. Найдите «учебник по работе с eclipse»; вот хороший: http://www.vogella.com/articles/EclipseJobs/article.html
Вы получаете это переключение, потому что вы пытаетесь получить доступ к потоку пользовательского интерфейса из потока без UI. использование Display.syncExec()
или Display.asyncExec()
решит вашу проблему.
Вы столкнулись с самым распространенным исключением в мире SWT! Недопустимый доступ к потоку означает только одно: вы хотите изменить или просто получить доступ к элементу GUI, и вы делаете это в потоке, который не является потоком графического интерфейса пользователя.
Это никогда не происходит, когда ваш код нажимает кнопку или что-то в этом роде, но при использовании фонового процесса или асинхронных уведомлений это происходит постоянно.
Там одно решение: выполнить свой код в определенном блоке:
Display.getDefautl().syncExec(new Runnable() {
public void run() {
// code related to GUI element(s)
}
}
или
Display.getDefautl().asyncExec(new Runnable() {
public void run() {
// code related to GUI element(s)
}
}
В первом случае выполнение синхронно. Вызывающий поток ожидает выполнения метода выполнения. Во втором случае вызывающий поток не ждет.
Чтобы узнать больше о потоках в приложении Eclipse, посмотрите на стек в режиме отладки (в режиме отладки). Первый поток под названием Main - это поток пользовательского интерфейса.
Вы должны использовать Display.getDefault(). AsyncExec() или Display.getDefautl(). SyncExec().
Пример код:
@PostConstruct
public void createControls(Composite parent) {
.... \\ label definition
}
public void updateInterface(String message)
{
try{
Display.getDefault().asyncExec(new Runnable() {
@Override
public void run() {
try{
label.setText(message);
}
catch(Exception exc){
System.out.println(exc);
}
}
});
}
catch(Exception exception){
System.out.println(exception);
}
}
Обычно я бы не стал использовать java.lang.Thread в RCP приложения, так как Eclipse, обеспечивает различный уровень абстракции и контроля за длительные операции через API Jobs (https://eclipse.org/articles/Article-Concurrency/jobs-api.html). Вот решение вашей проблемы:
Runnable uiUpdater = new Runnable() {
public void run() {
// update SWT UI safely here
// ...
}
};
Job longRunningOperation = new Job("My command") {
protected IStatus run(IProgressMonitor monitor) {
// some time consuming code here
// ...
Display.getDefault().asyncExec(uiUpdater);
return Status.OK_STATUS;
}
};
longRunningOperation.schedule();
- 1. Netbeans RCP vs Eclipse RCP
- 2. Eclipse RCP vs Eclipse PDE
- 3. Eclipse RCP и плагин Eclipse
- 4. Отладка приложений Eclipse RCP
- 5. Eclipse RCP с JFreeChart
- 6. Eclipse RCP ListProvider tweaking
- 7. Eclipse RCP Databinding
- 8. Eclipse e4 RCP BundleActivator
- 9. Eclipse RCP привязка ключа
- 10. Eclipse RCP - Обновление IStatusLineManager
- 11. Eclipse RCP case study
- 12. Окно модели RCP Eclipse
- 13. Экспорт Eclipse RCP Продукт
- 14. Eclipse RCP - преимущество форм
- 15. Eclipse RCP java.lang.ClassNotFoundException: org.eclipse.core.runtime.adaptor.EclipseStarter
- 16. Eclipse RCP Адаптеры
- 17. Eclipse RCP XMLMultiPageEditorPart ошибки
- 18. Eclipse RCP продукт Экспорт
- 19. Eclipse RCP - Перспективный макет
- 20. Экспорт продукт Eclipse RCP
- 21. Экран заставки Eclipse RCP
- 22. Eclipse RCP Extension Points
- 23. Eclipse RCP: Пользовательская консоль
- 24. Eclipse RCP: Неразрешенные требования
- 25. Eclipse плагин RCP вопрос
- 26. Установка плагинов Eclipse RCP
- 27. Консоль Eclipse RCP
- 28. ECLIPSE E4 RCP - PreferenceDialog()
- 29. Firefox в Eclipse RCP
- 30. Viewpart Eclipse RCP resize
Да! «Вы получаете эту ошибку, потому что пытаетесь получить доступ к SWT-объекту в другом потоке». Это то, что я сказал в своем посте. Можете ли вы подробно объяснить, что такое Display.syncExec() или Display.asyncExec() и как их использовать в Eclipse RCP? – itun
Вы можете посмотреть Javadoc для них или Google, есть много примеров. Они в основном запускают код в потоке пользовательского интерфейса, чтобы вы могли получить доступ к объектам SWT. –