2012-04-10 104 views
4

我有一个eclipse rcp应用程序,它在子线程中定期(每5秒)执行一些工作。该线程执行一个方法来更新应用程序的状态行以指示工作已完成。 它看起来像这样:等待在eclipse rcp应用程序退出时运行作业

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"); 
     } 
    }); 
} 

它运行良好。我遇到的问题是当我关闭我的应用程序时,我得到一个空指针异常,并且时常出现此错误:

作业在平台关闭后发现仍然运行。乔布斯应该由插件>是关闭期间安排他们被取消:> org.eclipse.ui.internal.progress.TaskBarProgressManager $ 2

的问题是,这项工作是因为异步执行同一的,但运行时间一切都因为结束申请而被破坏。那么是否有办法获得/等待正在运行的UI作业,以便在应用程序关闭之前确保作业已完成?

回答

2

异常消息似乎表明您在关机过程中计划了setMessage,因此可能在if (PlatformUI.getWorkbench().isClosing()) return;之前加上类似代码的前缀应该有所帮助。 否则,请尝试更改asyncExecsyncExec以查看问题是否消失。

0

只是做有消息说什么:

在启动这项工作,在Activator.stop()插件“乔布斯应该由在 停机计划他们的插件取消”,确保您的Job实际上退出并且在完成之前不会继续关闭:请等待作业以stop()方法结束。这当然要求您设计计时器作业,使其立即响应此取消请求并终止。

你可以得到更糟糕的消息,然后上面的,但由于它是关闭,许多人往往忽略这些。例如,假设你的插件A使用了一个尚未加载的插件B中的类。关闭系统:首先它会stop() A,那么它会stop() B.如果你的任务现在预定,您将获得该类的ClassNotFound在B.

这一切都是无关紧要的(只是一个错误消息)如果你的Eclipse不需要存储任何重要的东西,但是如果你的Job的正确执行对于你的应用程序的数据一致性来说很重要,那么下次可能会导致更多的麻烦。

相关问题