如何使用Eclipse作业API中运行的任务使用计数器更新进度对话框

时间:2014-01-22 18:22:03

标签: java eclipse eclipse-plugin eclipse-rcp progressdialog

我第一次使用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对象有一个方法可以返回已处理的数据项的数量,但我不知道如何让进度对话框与注释对象进行对话。请帮助思考或举例。

3 个答案:

答案 0 :(得分:0)

您可以使用一定数量的参数调用monitor.worked()足够的次数,以匹配annotate.getTotal()所需的工作量。请注意,如果您正在如图所示在UI线程上进行工作,那么您将无法顺利地看到更新 - 它们也需要UI线程。

答案 1 :(得分:0)

如果您的长时间运行方法没有提供查找进度的方法,那么您可以做的最好的方法是在单独的线程中运行该方法并让Job定期更新进度监视器并在线程终止。

答案 2 :(得分:0)

我找到了解决这个棘手问题的方法。以下是步骤:

  1. 我在我的注释包中创建了一个名为IControlProgressDialog的接口,其方法为void setCurrentIndex();

  2. 方法annotateData中的
  3. 我添加了一个IControlProgressDialog类型的参数。

  4. 在迭代我的数据项的循环中我调用了setCurrentIndex();

  5. 我在我的插件中创建了一个名为ImplControlProgressDialog的类,它实现了该接口,并定义了一个IProgressMonitor类型的对象引用。

  6. ImplControlProgressDialog中的
  7. 我将方法setCurrentIndex()实现为

    void setCurrentIndex(){ monitor.worked(1); }

  8. 这使我能够在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();