eclipse rcp进度监视器

时间:2012-11-20 15:50:52

标签: java progress-bar eclipse-rcp jobs

我正在使用Job类创建一些任务,我正在使用进度监视器来显示进度视图中的进度。

    Job createNewJobRun(final int i, final Job previousJob) {
    Job job = new Job("Test Job " + i) {
        @Override
        protected IStatus run(IProgressMonitor monitor) {
            monitor.beginTask("Job is running", 100); //$NON-NLS-1$

            if (previousJob != null) {
                try {
                    previousJob.join();

                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
                            // do the real work 
            monitor.done();
            return Status.OK_STATUS;
        }
    };

    job.schedule();
    return job;

}

我不想以并行方式运行作业,但是如何在进度视图中初始化作业以显示将在上一个完成后执行。 上面的代码只是等待前一个代码,因此在第二个作业之后阻塞并且没有显示进度条...

3 个答案:

答案 0 :(得分:3)

调度规则应如下所示:

   public class MutexRule implements ISchedulingRule {
      public boolean isConflicting(ISchedulingRule rule) {
         return rule == this;
      }
      public boolean contains(ISchedulingRule rule) {
         return rule == this;
      }
   }

设置规则和日程安排:

   Job job1 = new SampleJob();
   Job job2 = new SampleJob();
   MutexRule rule = new MutexRule();
   job1.setRule(rule);
   job2.setRule(rule);
   job1.schedule();
   job2.schedule()

来源:Eclipse Wiki: FAQ How do I prevent two jobs from running at the same time?

答案 1 :(得分:2)

您需要查看Eclipse Jobs上的调度规则。

这应该有所帮助。 http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html

答案 2 :(得分:0)

一种可能的解决方案是使用@TomSeidel和@SambiReddy提出的调度规则,但这个解决方案有很多限制。

特别是,只有在所有先前作业完成之前不安排多个新作业时才会起作用,因为通常使用的调度规则没有序列概念。这可以修复,但结果通常很难维持。

你没有写任何关于有问题的工作,但如果我们一遍又一遍地重复同一个工作,那么简单的解决方案是在工作完成之前重新安排工作。 / p>

Job job = new Job("Test Job " + i) {
    @Override
    protected IStatus run(IProgressMonitor monitor) {
        monitor.beginTask("Job is running", 100); //$NON-NLS-1$

                        // do the real work 
        monitor.done();

        schedule(...);
        return Status.OK_STATUS;
    }
};

job.schedule();