最佳实践在Eclipse RCP中实现ProgressMonitorDialog

时间:2011-08-26 13:37:25

标签: eclipse eclipse-plugin eclipse-rcp swt

我希望在UI中显示长时间运行的操作(进程)的进度,以便用户可以了解后台作业的状态。这是我实现的方式,我觉得代码是荒谬的。以下是我的代码

dialog.run(true,false, new IRunnableWithProgress() {
    @Override
    public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
        monitor.beginTask("Main process", 10);
        for (int i = 0; i < 10; i++) {
            if (monitor.isCanceled()) return;
            monitor.subTask("Status  message");
            sleep(1000);
            // worked increases the monitor, the values are added to the existing ones
            monitor.worked(1);
            if(i == 3) {
                sleep(3000);
                callMe();//calling a long running function 
            }
            if(i == 9) {
                monitor.subTask("finishing setup..... please wait ");
                sleep(2000);
            }
        }
        monitor.done();
    }
});

注意:代码中的某处有一个睡眠方法

此处i == 3调用一个至少需要5分钟的操作/函数,执行函数后继续进行。

我不希望在执行函数(长时间运行操作)时停止进度,而是在执行时必须显示进度。

有人可以在显示进度时显示正确的编程实践

1 个答案:

答案 0 :(得分:1)

你的代码感觉荒谬的原因是将长时间运行的方法包装在一个IRunnableWithProgress.run()中实际上并没有增加多少,没有魔法。

要使ProgressMonitorDialog(或相关的Job API)适合您,您需要更改“callMe()”,以便将“IProgressMonitor monitor”作为参数,并使用它来监听取消请求,并且也用它来报告进展情况。

再说一遍,使用不同的措辞:您需要以递归方式将“IProgressMonitor monitor”作为参数添加到所有长时间运行的方法调用中。如果要报告任何进度和/或您希望它可以取消,则必须使用此(IProgressMonitor)构建所有长时间运行的操作。