当前位置: 首页 > 知识库问答 >
问题:

等待eclipse rcp应用程序退出时运行作业

笪波鸿
2023-03-14

我有一个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");   
         }
     });
}

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

发现作业在平台关闭后仍在运行。插件应取消作业

问题是,由于异步执行,作业正在运行,但同时由于关闭应用程序,所有内容都被破坏。那么,有没有办法获取/等待正在运行的UI作业,以便我可以确保在关闭应用程序之前完成作业?

共有2个答案

耿俊
2023-03-14

照留言上说的做:

“作业应由在关机期间计划作业的插件取消”

在启动此作业的插件的Activator中。stop(),确保作业实际退出,并且在完成之前不要继续关机:等待作业在方法中结束。当然,这需要您设计计时器作业,使其能够立即响应此取消请求并终止。

您可能会收到比上述消息更糟糕的消息,但由于这是一次关机,许多人倾向于忽略这些消息。例如,假设插件A使用插件B中尚未加载的类。系统关闭:首先,它将stop()A,然后它将stop()B。如果您现在计划了任务,您将获得B中类的ClassNotFound

如果Eclipse不需要存储任何重要内容,那么这一切都是无关紧要的(只是一条错误消息),但是如果正确执行作业对应用程序的数据一致性很重要,那么这可能会导致更多的麻烦,下次启动该工具。

宿洋
2023-03-14

异常消息似乎表明您在关机期间安排了setMessage,因此可能会在您的代码前面加上类似if(PlatformUI. getWorkbench(). isC0007())的内容返回应该会有所帮助。否则,请尝试将asyncExec更改为syncExec以查看问题是否消失。

 类似资料:
  • 进程退出和等待进程 当进程执行完它的工作后,就需要执行退出操作,释放进程占用的资源。ucore分了两步来完成这个工作,首先由进程本身完成大部分资源的占用内存回收工作,然后由此进程的父进程完成剩余资源占用内存的回收工作。为何不让进程本身完成所有的资源回收工作呢?这是因为进程要执行回收操作,就表明此进程还存在,还在执行指令,这就需要内核栈的空间不能释放,且表示进程存在的进程控制块不能释放。所以需要父进

  • 是否有办法对“应用程序运行失败”做出反应,例如在数据库不可用的情况下? 在我的例子中,所需的行为是退出JVM进程,因此docker容器将自动重新启动 我试着听“ContextClosedEvent”,但它对启动失败案例不起作用。

  • 问题内容: 是否可以编写一个在终止程序时System.exit将调用的方法? 问题答案: 使用。

  • 问题内容: 对于子进程,和函数可用于暂停当前进程的执行,直到子进程退出。但是此功能不能用于非子进程。 是否有另一个函数可以等待任何进程的退出? 问题答案: 什么都不等于。通常的做法是使用轮询,寻找返回值-1和的,表明进程已经一去不复返了。

  • 我在网上搜索了很多关于vs await async,但是在这个特定的使用场景中,我并不真正理解其中的区别。我相信情况很简单。 vs. 其中,是一个异步方法,其中包含一些异步调用,例如使用wait调用db。 问题: 在这种情况下,两者之间有什么区别吗?任何帮助或意见,谢谢!

  • 问题内容: 最近,我将计算机更新为功能更强大的计算机,并配备了四核超线程处理器(i7),因此可以使用大量实际并发。现在,我退出()正在开发的应用程序(带有Swing GUI)时, 偶尔会 遇到以下错误: 好吧,鉴于它开始使用具有更多并发能力的硬件发生,并且与线程有关,并且偶尔发生,这显然是某种时机。但是问题是堆栈跟踪太短了。我只有上面的清单。它根本不包含我自己的代码,因此很难猜测该错误在哪里。 有