Как обновить JFace Viewer из Job? - PullRequest
0 голосов
/ 04 мая 2010

Предостережение: Я все еще борюсь с правильным MVC в разработке плагинов Eclipse, поэтому, если вы видите здесь что-нибудь, что, скорее всего, причиняет мне больше боли, что я должен терпеть, пожалуйста, дайте мне знать.

Вопрос:

У меня есть представление с JFace Tree Viewer и таблицей (не просмотрщик таблиц ... который будет изменен в будущем).

У меня есть действие, которое инициализируется ссылкой на представление (мне это кажется ужасным, но я пока не знаю, как сделать это правильно). Когда действие выполняется - с помощью кнопки в представлении - действие: 1) получает Tree Viewer из вида 2) получает базовую модель 3) создает работу а) внутри работы перебирает модель и делает с ней разные вещи, включая добавление в модель дополнительных дочерних элементов б) использует функцию, представленную в представлении, которая «очищает» таблицу в представлении 4) добавляет JobChangeListener, который реализует "done ()". а) внутри метода done () он расширяет средство просмотра дерева с помощью этого кода:

loadMethodsJob.addJobChangeListener(new JobChangeAdapter(){
        public void done(IJobChangeEvent event){
            view.enableActions();
            view.getTestsViewer().expandAll();
        }
    });

Внутри работы, всякий раз, когда я пытаюсь получить доступ к элементам в программе просмотра, я получаю ошибки Invalid Thread Access. Мне кажется, я понимаю, почему я получаю их при работе внутри работы, но я не уверен, как правильно их обойти, если не могу взаимодействовать с виджетами в слушателе смены работы. Я могу заставить его работать, если я обертываю каждое взаимодействие с виджетами в getDisplay (). SynchExec (....), но мне кажется, что я помню, что читал, что это не желательно.

Я чувствую, что нахожусь на пороге большого скачка в понимании с Eclipse SWT, поэтому я ценю любые рекомендации, как туда добраться.

1 Ответ

1 голос
/ 18 мая 2010

Любой компонент пользовательского интерфейса в SWT может быть доступен только потоку пользовательского интерфейса.

Поскольку метод done задания выполняется в отдельном потоке, не являющемся пользовательским интерфейсом, запускается недопустимый доступ к потоку.

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

Не должно быть никаких проблем с вышеуказанным подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...