我希望在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分钟的操作/函数,执行函数后继续进行。
我不希望在执行函数(长时间运行操作)时停止进度,而是在执行时必须显示进度。
有人可以在显示进度时显示正确的编程实践
答案 0 :(得分:1)
你的代码感觉荒谬的原因是将长时间运行的方法包装在一个IRunnableWithProgress.run()中实际上并没有增加多少,没有魔法。
要使ProgressMonitorDialog(或相关的Job API)适合您,您需要更改“callMe()”,以便将“IProgressMonitor monitor”作为参数,并使用它来监听取消请求,并且也用它来报告进展情况。
再说一遍,使用不同的措辞:您需要以递归方式将“IProgressMonitor monitor”作为参数添加到所有长时间运行的方法调用中。如果要报告任何进度和/或您希望它可以取消,则必须使用此(IProgressMonitor)构建所有长时间运行的操作。