2012-03-13 3 views
0

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

Я пытался это сделать: 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

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

Смежные вопросы