Дождитесь запуска заданий при выходе из приложения eclipse rcp

У меня есть приложение eclipse rcp, которое периодически (каждые 5 секунд) выполняет некоторую работу в дочернем потоке. Поток выполняет метод для обновления строки состояния приложения, чтобы указать, что работа завершена. Это выглядит так:

protected void updateStatusBar()
{
     Display.getDefault().asyncExec(new Runnable() {
         @Override
         public void run() {
             PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(MainView.ID).
             getViewSite().getActionBars().getStatusLineManager().setMessage("work finished");   
         }
     });
}

Он работает нормально. У меня проблема в том, что когда я закрываю свое приложение, я время от времени получаю исключение Null Pointer с этой ошибкой:

Обнаружено, что задание все еще выполняется после завершения работы платформы. Задания должны быть отменены подключаемым модулем >который запланировал их во время выключения: >org.eclipse.ui.internal.progress.TaskBarProgressManager$2

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


person Biene Maja    schedule 10.04.2012    source источник


Ответы (2)


Сообщение об исключении, по-видимому, указывает на то, что вы планируете setMessage во время выключения, поэтому, вероятно, должно помочь префикс вашего кода с чем-то вроде if (PlatformUI.getWorkbench().isClosing()) return;. В противном случае попробуйте изменить asyncExec на syncExec, чтобы увидеть, исчезнет ли проблема.

person hgrey    schedule 14.04.2012

Просто сделайте то, что написано в сообщении:

«Задания должны быть отменены плагином, который запланировал их во время выключения»

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

Вы можете получить гораздо худшие сообщения, чем приведенные выше, но, поскольку это отключение, многие люди склонны их игнорировать. Например, предположим, что ваш плагин A использует класс из плагина B, который еще не загружен. Система выключается: сначала будет stop() A, затем stop() B. Если ваше задание запланировано сейчас, вы получите ClassNotFound для класса B.

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

person user6021429    schedule 05.03.2016