1

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;

}

ジョブを並列で実行したくないのですが、順番に、進行状況ビューでジョブを初期化して、前の処理が終了した後にが実行されることを示すにはどうすればよいですか。上記のコードは前のコードを待つだけなので、2番目のジョブの後のブロックとプログレスバーは表示されません...

4

3 に答える 3

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 2つのジョブが同時に実行されないようにするにはどうすればよいですか?

于 2012-11-21T08:46:25.923 に答える
2

Eclipse ジョブのスケジューリング ルールを確認する必要があります。

これは役立つはずです。 http://www.eclipse.org/articles/Article-Concurrency/jobs-api.html

于 2012-11-20T17:11:06.207 に答える
0

考えられる解決策は、@TomSeidel と @SambiReddy によって提案されたスケジューリング ルールを使用することですが、この解決策には多くの制限があります。

特に、以前のすべてのジョブが完了する前に複数の新しいジョブをスケジュールしない場合にのみ機能します。これは、通常使用されるスケジューリング ルールにシーケンスの概念がないためです。これは修正できますが、通常、結果を維持するのは非常に困難です。

問題のジョブについては何も書いていませんが、同じジョブを何度も繰り返すことについて話している場合、簡単な解決策は、ジョブが完了する前に (直前に) スケジュールを変更することです。

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();
于 2012-11-21T17:00:27.653 に答える