SWT зависает / зависает в Linux при развертывании как Java Web Start - PullRequest
2 голосов
/ 12 ноября 2010

Приложение Java WebStart, над которым я работаю, использует SWT для графического интерфейса, и недавно я обнаружил небольшую, но раздражающую проблему. Когда я выбираю действие, которое использует FileDialog, т. Е. Сохраняет изображение, пользовательский интерфейс останавливается сразу после закрытия диалога. Изображение сохраняется, и его можно без проблем открыть с помощью программы просмотра изображений по умолчанию, но с тех пор приложение перестает отвечать на запросы, и я вынужден убить приложение.

Я заметил, что результат тот же, когда я пытаюсь открыть файл с помощью FileDialog, если я вместо этого открываю тот же файл, отправив его в качестве аргумента с помощью файла jnlp, он работает нормально, поэтому я не Не думаю, что это проблема с локальной файловой системой.

Я попытался воспроизвести проблему на Windows, чтобы убедиться, что она хорошо работает на Win 7. В качестве второй попытки устранения неполадок я попытался сохранить изображение из локальной версии приложения (другими словами, не JWS) и это тоже хорошо работает ...

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

Есть идеи?

ОБНОВЛЕНИЕ: Похоже, что здесь проблема не только в FileDialog, но и в любом виде графического взаимодействия с пользователем. Всякий раз, когда окна SWT развернуты, программа зависает с серым экраном, ПОСЛЕ любого действия, которое должно было быть сделано. Я скопировал некоторый код ниже, в этом конкретном примере, даже если я нажму «Отмена», приложение перестает отвечать на запросы с серым экраном. Вот пример кода:

    public static boolean saveChangesBeforeDiscard(MyMain main)
{
    if (main.isDirty())
    {
        MessageBox messageBox = new MessageBox(
            main.getShell(),
            SWT.ICON_WARNING | SWT.YES | SWT.NO | SWT.CANCEL);

        messageBox.setMessage("Would you like to save the changes?");
        messageBox.setText(MyMain.TOOL_NAME);
        int answer = messageBox.open();

        if (answer == SWT.YES)
        {
            SaveFileAction save = new SaveFileAction(main);
            save.run();

            return save.isSaved();
        }
        else if (answer == SWT.NO)
        {
            return true;
        }

        return false;
    }

    return true;
}

Обновление 2: Кстати, я использую Sun JDK 1.6.0. Вот вывод команды java -version:

Java-версия "1.6.0_22" Java (TM) SE Runtime Environment (сборка 1.6.0_22-b04) Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 17.1-b03, смешанный режим)

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

Если для сохранения SaveFileAction.run () требуется много времени, это объясняет зависание пользовательского интерфейса.

В SWT вы обязаны запустить насос событий.Обычно это выглядит примерно так:

while (!shell.isDisposed()) {
  if (!display.readAndDispatch()) {
    display.sleep();
  }
}

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

Когда требуются длительные операции, рекомендуется использовать SWT.чтобы выполнить операцию в рабочем потоке, отправляя асинхронные обновления в пользовательский интерфейс по мере необходимости.

executor.execute( new Runnable() {
  public void run() {
    showStatusMessage("Saving "+filename+"...");

    SaveFileAction save = new SaveFileAction(main);
    save.run();

    showStatusMessage("File "+filename+" saved.")
  }

  private void showStatusMessage(final String message) {
    Display.getDefault().asyncExec( new Runnable() {
      public void run() {
        statusLine.setMessage(message);
      }
    } );
  }
} );

Эта запись в часто задаваемых вопросах SWT объясняет модель потоков более подробно.

1 голос
/ 15 марта 2011

В SWT есть ошибка, которая вызывает это: здесь

Ошибка недавно была устранена - см. Ошибку для получения дополнительной информации.

0 голосов
/ 30 апреля 2012

У меня просто была похожая проблема. Я решил эту проблему, запустив файл jnlp с помощью IcedTea Java 6 Webstart (OpenJDK javaws) вместо Oracle javaws.

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