進行状況の報告

長時間実行するジョブ (1 秒以上かかるジョブ) は、ジョブの run メソッドに渡される IProgressMonitor に進行状況を報告する必要があります。 ワークベンチの進行状況ビューには、すべての進行状況メッセージおよびこのモニターに指定されている完了作業単位が表示されます。

用意された進行状況モニターを使用して、進行状況ビューからのキャンセル要求も確認する必要があります。 ユーザー (またはジョブ API を使用しているプラグイン) がジョブをキャンセルすると、IProgressMonitor メソッド isCanceled()true を戻します。 ジョブは、ジョブのキャンセル状況を頻繁にチェックし、キャンセルを検出後すぐに run メソッドを終了して、キャンセルに応答する必要があります。 以下の run メソッドでは、進行状況を報告し、ジョブのキャンセルに応答します。

            public IStatus run(IProgressMonitor monitor) {
final int ticks = 6000;monitor.beginTask("Doing some work", ticks);  try {
for (int i = 0; i < ticks; i++) {if (monitor.isCanceled())return Status.CANCEL_STATUS;monitor.subTask("Processing tick #" + i);//... do some work ...monitor.worked(1);         }
   } finally {
monitor.done();      }
return Status.OK_STATUS;
}

beginTask メソッドを使用して、対応する進行状況ビュー内のタスクに名前を付け、 このビューが進行状況を計算するために実行する作業の総量を設定します。 作業が完了すると、進行状況ツリーの子として、subTask メッセージが表示されます。 進行状況ビューは、処理済みの呼び出しで報告された作業量に基づいて、完了したパーセントを計算して表示します。

進行状況モニターおよび UI

IProgressMonitor クラスは、対応する UI サポートを考慮に入れて設計されています。 プラットフォームの UI プラグインは、ワークベンチが実行中のジョブの進行状況を表示できるようにするためのサポートを提供しています。 このことを念頭にジョブをセットアップすることで、ジョブの表示方法を制御することができます。

ジョブの進行状況を表示する場合に使用可能な API についての詳細は、『ワークベンチ並行性のサポート』を参照してください。

システム・ジョブ

ジョブが、ユーザーに対して表示させたくない低レベル実装詳細である場合もあります。 ジョブにシステム・ジョブ としてフラグを立てることができます。 システム・ジョブは、他のジョブと同様ですが、対応する UI サポートが進行状況ビューをセットアップしないか、 ジョブの実行に関連付けられているその他の UI 情報を表示する点が異なります。 ジョブがユーザーによって直接開始されていないか、ユーザーが構成できる定期的なタスクでない場合、そのジョブはシステム・ジョブです。 システム・ジョブを設定するプロトコルは単純です。

      class TrivialJob extends Job {
      public TrivialJob() {
         super("Trivial Job");
         setSystem(true);
      }
      ...
   }

setSystem 呼び出しを実行してから、ジョブをスケジュールする必要があります。 現在待機中、スリープ中、または実行中のジョブに対してこの呼び出しを実行すると、例外が起動されます。

ユーザー・ジョブ

ジョブがユーザーによって開始された長期実行操作である場合は、ジョブにユーザー・ジョブ としてフラグを立てる必要があります。 ユーザー・ジョブは、モーダル進行状況ダイアログに表示されます。 このダイアログには、ダイアログを背景に移動するボタンがあります。 ワークベンチは、これらのダイアログがモーダルかどうかを制御するユーザー設定を定義します。 ジョブをユーザー・ジョブとして定義すると、進行状況フィードバックは、進行状況ビューのユーザー設定に自動的に準拠します。 ユーザー・ジョブを設定するプロトコルは、以下のようになります。

      class TrivialJob extends Job {
      public TrivialJob() {
         super("Trivial Job");
         setUser(true);
      }
      ...
   }

ジョブは、setUser 呼び出しも実行した後にスケジュールする必要があります。

進行状況グループ

進行状況グループ も、UI でのジョブの表示方法に影響を与えるもう一つのメカニズムです。 UI に複数の関連ジョブの集約的な進行状況を表示する方がより適切な場合は、関連ジョブのグループを表す特殊な IProgressMonitor が作成されます。 このモニターは、IJobManager プロトコルを使用して作成されます。 以下のコマンドの断片は、進行状況グループの作成と、そのジョブへの関連付けを示しています。

   ...
   IJobManager jobMan = Platform.getJobManager();
myGroup = jobMan.createProgressGroup();job.setProgressGroup(myGroup, 600);  // specify the units of work the job needs to show.job.schedule()   ...

グループ機能によって、プラグインは必要に応じてタスクを複数のジョブに分割し、 ユーザーには分割したタスクを 1 つのタスクとして報告することができます。 進行状況グループ・モニターは、グループ内のすべてのジョブに関連する完了の割合を計算する詳細を処理します。

ジョブは、進行状況グループに配置してからスケジュールする必要があります。 ジョブの実行が完了すると、そのジョブの進行状況グループへの参照は失われます。 ジョブを再度スケジュールする場合は、スケジュールする前に再度グループに配置する必要があります。