4

私は定期的に(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");   
         }
     });
}

それはうまくいきます。私が抱えている問題は、アプリを閉じると、時々このエラーで Null Pointer Exception が発生することです:

プラットフォームのシャットダウン後も実行中のジョブが見つかりました。ジョブはプラグインによってキャンセルする必要があります >シャットダウン中にジョブをスケジュールした: >org.eclipse.ui.internal.progress.TaskBarProgressManager$2

問題は、非同期実行のためにジョブが実行されていると同時に、アプリケーションが閉じているためにすべてが破壊されていることです。アプリが閉じられる前にジョブが終了していることを確認できるように、実行中の UI ジョブを取得/待機する方法はありますか?

4

2 に答える 2

2

例外メッセージは、シャットダウン中にスケジュールを設定したことを示しているようですsetMessage。そのため、コードの前に次のようなプレフィックスを付けるとif (PlatformUI.getWorkbench().isClosing()) return;役立つはずです。それ以外の場合は、に変更asyncExecsyncExecて、問題が解決するかどうかを確認してください。

于 2012-04-14T00:32:52.047 に答える
0

メッセージの内容を実行するだけです:

「シャットダウン中にジョブをスケジュールしたプラグインによって、ジョブをキャンセルする必要があります」

で、このジョブを開始するプラグインでActivator.stop()、ジョブが実際に終了し、完了する前にシャットダウンを続行しないことを確認しますstop()。メソッドでジョブが終了するのを待ちます。もちろん、これには、このキャンセル要求に即座に反応して終了するようにタイマー ジョブを設計する必要があります。

上記のメッセージよりもはるかに悪いメッセージが表示される可能性がありますが、シャットダウンであるため、多くの人はそれらを無視する傾向があります. たとえば、プラグイン A がまだロードされていないプラグイン B のクラスを使用しているとします。システムがシャットダウンします。最初にstop()A になり、次にstop()B になります。タスクが今スケジュールされている場合はClassNotFound、B のクラス の a が取得されます。

Eclipse が重要なものを保存する必要がない場合、これはすべて無関係です (単なるエラー メッセージです)。ただし、ジョブの適切な実行がアプリケーションのデータの一貫性にとって重要である場合、ツールの起動時にさらに問題が発生する可能性があります。次の時間。

于 2016-03-05T06:48:18.423 に答える