报告进度

长时间运行的作业(它们的持续时间比其它作业更长)应该向被传递至作业的 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 消息将作为进度树中的子代出现。进度视图将根据 worked 调用中报告的工作量来计算和显示完成百分比。

进度监视器和用户界面

正如您可以看到的那样,IProgressMonitor 类是在考虑了相应的用户界面支持的情况下设计的。平台的用户界面插件提供支持,以便工作台可以显示正在运行的作业的进度。可以在具有这种概念的情况下设置作业,以便能够控制如何显示作业。

要详细查看可用于显示作业进度的 API,请参阅工作台并行支持

系统作业

如果作业是不想对用户显示的低级实现详细信息,则怎么办?可以将作业标记为系统作业。除了相应的用户界面支持将不设置进度视图或显示与运行作业相关联的任何其它用户界面内容之外,系统作业与任何其它作业是一样的。如果作业不是由用户直接启动也不是可以由用户配置的定期任务,则该作业应该是系统作业。用于设置系统作业的协议很简单:

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

在调度作业之前,必须调用 setSystem。如果对当前正在等待、正在休眠或正在运行的作业尝试执行此调用,就会产生异常。

用户作业

如果作业是由用户启动的长时间运行的操作,则应该将作业标记为用户作业。用户作业将显示在模态进度对话框中,该对话框提供了用于将它移至后台的按钮。工作台定义了一个用户首选项来控制这些对话框是否是模态的。通过将作业定义为用户作业,进度反馈将自动符合进度视图的用户首选项。用于设置用户作业的协议是相似的:

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

在调度作业之前,还必须进行 setUser 调用。

进度组

进度组是可以用来影响作业在用户界面中的显示方式的另一种机制。当在用户界面中显示几个相关作业的聚集进度更合适时,可以创建用来表示一组相关作业的特殊 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()   ...

组设施允许插件在需要时将任务分为多个作业,但是向用户报告这些作业时一定要当作单个任务来报告。进度组监视器将处理计算相对于该组中的所有作业的完成百分比的详细信息。

在调度作业之前,必须将它放置到进度组中。在作业运行完之后,它就会失去对进度组的引用。如果要再次调度该作业,则在调度它之前必须将它再次设置到组中。