在Eclipse插件中内部使用IProgressMonitor,这是一个好习惯吗?

时间:2015-04-11 19:43:44

标签: java eclipse eclipse-plugin

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一样,需要“完成工作”的概念来跟踪进度。)

0 个答案:

没有答案