Arhn - архитектура программирования

Получение представления по идентификатору из запущенного экземпляра eclipse

Я создал следующий класс StatisticsView для пользовательского представления для моего плагина Eclipse:

public  class StatisticsView extends ViewPart {
    public StyledText projectname;
    public void createPartControl(Composite parent) {
            GridLayout layout = new GridLayout(3, false);
        parent.setLayout(layout);
        //Project Name
        Label projectnameLabel = new Label(parent, SWT.NONE);
        projectnameLabel.setText("Project name: ");
        projectname = new StyledText(parent, SWT.NONE);
        projectname.setText("Anything for now");
                               .
                               .
    }
                               .
                               .
    public String getProjectName() {
        return projectname.getText();
    }

    public void updateData(Stats statistics) {
              projectname.setText(statistics.getProjectName());     //causes the error
                             .
                             .
    }
}

Файл plugin.xml имеет следующую точку зрения:

<extension
         point="org.eclipse.ui.views">
      <category
            name="XYZ"
            id="XYZ">
      </category>
      <view
            name="Statistics"
            inject="true"
            category="XYZ"
            class="XYZ.view.StatisticsView"
            id="XYZ.view.StatisticsView">
      </view>
   </extension>

Я запускаю проект с помощью "Запуск от имени приложения Eclipse", которое открывает новый экземпляр Eclipse (назовем его Inner Eclipse) и где отображается мое представление.

У меня есть в моем проекте (откуда я запускаю проект, то есть не внутреннее затмение) другой класс ResultsListener, в котором я пытаюсь найти это представление, используя его "id", например:

                .....
IWorkbenchWindow workbenchWindow = null;
IWorkbenchWindow[] allWindows = PlatformUI.getWorkbench().getWorkbenchWindows();
for (IWorkbenchWindow window : allWindows) {
      workbenchWindow = window;
      if (workbenchWindow != null) {
             System.out.println("Found workbench");
             break;
      }
}
IWorkbenchPage activePage = workbenchWindow.getActivePage();
IViewPart viewPart = activePage.findView("XYZ.view.StatisticsView");
if(viewPart==null) {
      System.out.println("View Not found");
}
StatisticsView myView = (StatisticsView)viewPart;
System.out.println(myView.getProjectName());      //causes the error
myView.updateData(stat);

Всякий раз, когда я вызываю любой метод найденного представления, он дает мне следующую ошибку: org.eclipse.swt.SWTException: Invalid thread access

В моем классе ResultsListener мне нужно выполнить некоторый анализ, а затем обновить виджеты представления, которые затем должны быть отражены во внутреннем затмении. Любая помощь могла бы быть полезна

28.01.2019

  • «Недопустимый доступ к потоку» означает, что вы запускаете код пользовательского интерфейса в потоке, отличном от пользовательского интерфейса. Как запускается этот ResultListener? 29.01.2019
  • ResultListener — это простой класс, который выполняет некоторые вычисления и просто вызывается другими классами. Он не имеет никаких компонентов пользовательского интерфейса. Как я могу заставить его работать как поток пользовательского интерфейса? 29.01.2019
  • Но как выполняется этот код? Что это называет? Класс SWT Display имеет методы asyncExec и syncExec для запуска кода в потоке пользовательского интерфейса, но, судя по всему, весь этот код должен находиться в потоке пользовательского интерфейса. 29.01.2019
  • Его вызывает класс Analysis Kickoff, который создает поток для использования своего метода run для заполнения данными в ResultsListener. Мне нужны те же данные для заполнения виджетов моего представления. Итак, после получения представления по идентификатору я должен создать новый поток пользовательского интерфейса и вызывать методы, используя его? 29.01.2019
  • В SWT есть только один поток пользовательского интерфейса, вы не можете создать новый поток пользовательского интерфейса. Вместо этого поместите свой код пользовательского интерфейса (где вы получаете доступ к недопустимому потоку) в Runnable и выполните его через Display#asyncE‌xec(...) или Display#syncE‌xec(...) 29.01.2019

Ответы:


1

Недопустимый доступ к потоку означает, что вы запускаете код пользовательского интерфейса в потоке, отличном от пользовательского интерфейса.

Существует только один поток пользовательского интерфейса, вы можете организовать запуск кода в потоке пользовательского интерфейса, используя:

Display.getDefault().asyncExec(runnable);

где runnable — это реализация Runnable. Это может быть просто лямбда:

Display.getDefault().asyncExec(() -> { ... code block ... });

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

Код, работающий в потоке пользовательского интерфейса, не должен выполнять длительные операции, так как это заблокирует пользовательский интерфейс.

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

29.01.2019
  • В runnable я просто устанавливаю содержимое для виджетов представления. Он не выполняет никакой работы, не связанной с пользовательским интерфейсом. Но методы syncExec() или asyncExec() запускаются примерно через 20 секунд. Что означает, что поток пользовательского интерфейса работает над чем-то другим, прежде чем обслужит мой запрос. Есть ли способ заставить его работать немедленно? 29.01.2019
  • Нет, они запускаются, как только поток пользовательского интерфейса освобождается для их обработки, но обычно это измеряется в миллисекундах, а не в секундах. Похоже, поток пользовательского интерфейса может выполнять длительную работу, которой не должно быть в этом потоке. 29.01.2019
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..