Лучшая практика для передачи значений из потока, не являющегося пользовательским интерфейсом, в поток пользовательского интерфейса в приложении плагина Eclipse - PullRequest
4 голосов
/ 03 декабря 2009

Есть ли лучший практический пример передачи значений из потока, не являющегося пользовательским интерфейсом, в поток пользовательского интерфейса в приложении-плагине Eclipse?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2009

Вы можете использовать Display.asyncExec ()

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

Runnable, который выполняется с использованием syncExec(), наиболее точно соответствует эквивалентному прямому вызову операции пользовательского интерфейса, поскольку вызов метода Java всегда ожидает результата, прежде чем продолжить, как syncExec().

Как показано этой веткой :

Я думал, что все эти runnables или потоки, которые я даю Display.sync или asyncExec, 'Threads', и они планируются jvm или чем-то другим вместе с потоком пользовательского интерфейса!
Я никогда не знал, что они не считаются потоками, а только фрагментами кода, выполняемыми потоком пользовательского интерфейса асинхронно!

Этот фрагмент кода, асинхронно выполняемый потоком пользовательского интерфейса, может быть хорошим местом для доступа к значениям (синхронизированный доступ) из другого потока.

См. " Как обновить GUI из другого потока в Java " в качестве практического примера передачи значения в поток пользовательского интерфейса.

(Примечание: не-затмение без SWT было бы в Swing с использованием Swing Worker, как я упоминал год назад )

1 голос
/ 07 декабря 2010

Немного поздно вхожу в этот, но я бы использовал org.eclipse.ui.progress.UIJob.

Когда ваш не-пользовательский поток имеет некоторую информацию для отправки в пользовательский интерфейс, он может порождать UIJob, который выполняется на определенном дисплее. За кулисами используется asyncExec, но вместе с ним вы получаете множество полезных частей API заданий, таких как ProgressMonitor, отмена задания, планирование правил и объединение / ожидание других заданий.

...