2012-04-10 102 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的正確執行對於你的應用程序的數據一致性來說很重要,那麼下次可能會導致更多的麻煩。

相關問題