правильный способ закрыть приложение RCP затмения из плагина? - PullRequest
0 голосов
/ 13 марта 2012

Я пытаюсь запустить приложение RCP Eclipse из командной строки.Самая подходящая часть в порядке, я могу анализировать аргументы cmdline и делать то, что хочу.Но после этого я хотел бы закрыть приложение.Как правильно добиться этого?

Я пытался это: PlatformUI.getWorkbench (). Close ();

Но получил это:

org.eclipse.swt.SWTException: Failed to execute runnable (org.eclipse.swt.SWTException: Widget is disposed)
    at org.eclipse.swt.SWT.error(SWT.java:4282)
    at org.eclipse.swt.SWT.error(SWT.java:4197)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:138)
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3563)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3212)
    at org.eclipse.swt.widgets.Display.release(Display.java:3263)
    at org.eclipse.swt.graphics.Device.dispose(Device.java:249)
    at uk.ac.bolton.archimate.editor.Application.start(Application.java:65)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
    Caused by: org.eclipse.swt.SWTException: Widget is disposed
    at org.eclipse.swt.SWT.error(SWT.java:4282)
    at org.eclipse.swt.SWT.error(SWT.java:4197)
    at org.eclipse.swt.SWT.error(SWT.java:4168)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:466)
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:403)
    at org.eclipse.swt.browser.Browser.checkWidget(Browser.java:195)
    at org.eclipse.swt.browser.Browser.addProgressListener(Browser.java:386)
    at org.rulez.magwas.styledhtml.EventLog$1.run(EventLog.java:80)
    at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
    ... 18 more

Этокак я делаю дела при запуске:

protected void refreshPluginActions() {
 if (!PlatformUI.isWorkbenchRunning()) {
        return;
    }
 Display.getDefault().asyncExec(new Runnable() {
    public void run() {
        runcmd();
    }
 });
}

1 Ответ

1 голос
/ 13 марта 2012

Вы используете правильный API для этой цели. Судя по трассировке стека, похоже, что в классе org.rulez.magwas.styledhtml.EventLog есть ошибка, из-за которой он пытается что-то обновить в пользовательском интерфейсе во время завершения работы. Типичное решение состоит в том, чтобы убедиться, что рассматриваемый код выполняет вызов Widget.isDisposed (), прежде чем пытаться манипулировать пользовательским интерфейсом, и безопасно отключиться, если рассматриваемый виджет уже удален.

...