報告進度

長時間執行的工作(持續超過一秒鐘的工作)應該報告進度給 IProgressMonitor, 這會傳遞給工作的 run 方法。工作台進度視圖會顯示提供給這個監視器的所有進度訊息和已完成工作的單位數。

提供的進度監視器也應會用來檢查進度視圖中是否有取消要求。當使用者(或使用工作 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);//... 執行一些工作 ...monitor.worked(1);         }
   } finally {
monitor.done();      }
return Status.OK_STATUS;
}

beginTask 方法用來在對應的進度視圖中命名作業以及建立要完成的總工作量,這樣視圖就可以計算進度。subTask 訊息在工作完成時會顯示為進度樹狀結構中的子項。進度視圖將會根據 worked 呼叫中報告的工作量來計算和顯示完成百分比。

進度監視器和 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);  // 指定工作需要顯示的工作單元。job.schedule()   ...

群組機能允許外掛程式在需要時將作業分成數個工作,但是以單一作業的形式報告給使用者。進度群組監視器會處理詳細內容,計算相對於群組中所有工作的完成百分比。

在排程工作之前,工作必須先放到進度群組中。在工作完成執行之後,就會遺失對進度群組的參照。如果工作要重新排程,排程之前必須再次設定到群組中。