TL; DR:我的问题是,使用IProgressMonitor
界面内部跟踪进度是否是一个好习惯,或者它纯粹是为了向进度反馈提供用户。
在我正在开发的Eclipse插件的内部,有几个(大多数)后台任务。例如,解析一些输入(例如,从文件中),并用结果填充数据库。其中一些任务在插件创建的专用线程上运行,另一个作为Job运行。
对于所有任务,还有其他插件组件(让我们称之为感兴趣的各方)需要跟踪任务的进度和状态,例如完成的工作百分比,是否是已完成,是否正在运行或暂停(暂停)。
根据run
方法,作业具有进度监视器(IProgressMonitor
),用于在UI中显示进度条并允许用户取消作业。
IProgressMonitor
界面使用的进展概念在很大程度上与感兴趣方所需的信息重叠。
因此,通过向作业添加额外的IProgressMonitor
,使用该界面通知感兴趣的各方似乎是有意义的。将为每个感兴趣方添加一个监视器,并且所有监视器可以一起包装在单个ProgressMonitorWrapper
中,以便在工作完成时更新所有监视器。例如:
Job aJob = new Job("My long-running operation...") {
protected IStatus run(IProgressMonitor monitor) {
IStatus status = Status.OK_STATUS;
IProgressMonitor wrappedMonitor = new ProgressMonitorWrapper(monitor) {
// override everything so that you can report it locally, too
public void beginTask(String name, int totalWork) {
super.beginTask(name, totalWork);
someLocalMonitor.beginTask(name, totalWork);
}
};
wrappedMonitor.beginTask("foo", 100);
try {
// Execute, update amount of work done, etc.
}
finally {
wrappedMonitor.done();
}
return status;
};
});
(复制并改编自Eclipse wiki。Source)
可以在我们的插件生成的线程中使用类似的方法。
但是,我没有足够的经验来确定这是否适合使用IProgressMonitor
接口。当然,另一种方法是创建一个自定义侦听器界面(与IProgressMonitor
一样,需要“完成工作”的概念来跟踪进度。)