我第一次使用Eclipse jobs API。我有一个插件需要从jar文件调用一个方法来处理大数据,所以我需要显示一个进度对话框。我的问题是,如何使用已处理的数据项更新进度对话框?现在我有这个代码
Job job = new Job("Annotate"){
protected IStatus run(IProgressMonitor monitor){
monitor.beginTask("Annotation..", annotate.getTotal());
annotate.annotateData();
monitor.done();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
SaveUtils.saveEntry(wizard.getEntry(), AnnotationEntry);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();
annotate对象有一个方法可以返回已处理的数据项的数量,但我不知道如何让进度对话框与注释对象进行对话。请帮助思考或举例。
答案 0 :(得分:0)
您可以使用一定数量的参数调用monitor.worked()足够的次数,以匹配annotate.getTotal()所需的工作量。请注意,如果您正在如图所示在UI线程上进行工作,那么您将无法顺利地看到更新 - 它们也需要UI线程。
答案 1 :(得分:0)
如果您的长时间运行方法没有提供查找进度的方法,那么您可以做的最好的方法是在单独的线程中运行该方法并让Job
定期更新进度监视器并在线程终止。
答案 2 :(得分:0)
我找到了解决这个棘手问题的方法。以下是步骤:
我在我的注释包中创建了一个名为IControlProgressDialog的接口,其方法为void setCurrentIndex();
我添加了一个IControlProgressDialog类型的参数。
在迭代我的数据项的循环中我调用了setCurrentIndex();
我在我的插件中创建了一个名为ImplControlProgressDialog的类,它实现了该接口,并定义了一个IProgressMonitor类型的对象引用。
我将方法setCurrentIndex()实现为
void setCurrentIndex(){ monitor.worked(1); }
这使我能够在annotate.annotateData()在另一个线程上运行时更新进度对话框。
我工作的更新代码:
Job job = new Job("Annotate"){
protected IStatus run(IProgressMonitor monitor){
monitor.beginTask("Annotation..", annotate.getTotal());
ImplControlProgressDialog control = new ImplControlProgressDialog (monitor);
annotate.annotateData(control);
monitor.done();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
SaveUtils.saveEntry(wizard.getEntry(), AnnotationEntry);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();