Подтвердить что ты не робот

Разница между syncExec() и asyncExec() класса Display

Я работаю над проектом плагина, в котором я использую фотовую обработку Eclipse.
Какая разница между syncExec() и asyncExec() методы класса Display? В каких ситуациях они применимы? Любой пример может быть полезен.

4b9b3361

Ответ 1

from В: Почему я получаю сообщение об ошибке "org.eclipse.swt.SWTException: Неверный доступ к потоку" ?

Чтобы позволить фоновым потокам выполнять операции над объектами, принадлежащими UI-потоку, используются методы syncExec (Runnable runnable) и asyncExec (Runnable runnable) Display. Это единственные методы в SWT, которые можно вызывать из любого потока. Они позволяют выполнить runnable посредством UI-потока либо синхронно, заставляя фоновый поток ждать завершения выполнения, либо асинхронно, позволяя фоновому потоку продолжить выполнение, не дожидаясь результата. Запуск, который выполняется с помощью syncExec(), наиболее точно соответствует эквивалентному прямому вызову операции UI, потому что вызов метода Java всегда ожидает результата перед продолжением, подобно syncExec().

Ответ 2

Добавляя к Tom Seidel ответ, вот примеры ситуаций, когда вы можете использовать один или другой:

  • Используйте asyncExec, если вы хотите что-то обновить в пользовательском интерфейсе, не заботясь о результатах. Например, обновите метку или индикатор выполнения.

  • Используйте syncExec, где код, следующий за вызовом этого метода, должен быть уверен, что пользовательский интерфейс находится в согласованном состоянии или нуждается в некоторых данных из пользовательского интерфейса. Например, получение некоторых данных из диалогового окна пользователя. Или вы обновляете виджет и перед тем, как делать что-либо еще (например, другое обновление пользовательского интерфейса), вы хотите знать, что обновление виджета завершено.

Ответ 3

SWT реализует однопоточную модель пользовательского интерфейса. В этой модели только UI-поток может вызывать операции пользовательского интерфейса. Если вы попытаетесь получить доступ к SWT-объекту за пределами пользовательского интерфейса, вы получите исключение "org.eclipse.swt.SWTException: Неверный доступ к потоку". Поэтому, чтобы другие потоки могли выполнять операции над объектами, принадлежащими UI-потоку, SWT предоставляет методы syncExec и asyncExec.

Эта ссылка может помочь вам с примером