2016-10-15 11 views
1

実際の検索をいくつかの他の検索に委譲する私自身のISearchQueryを作成したいと思います。私は、他の検索のうちの1つだけが実際に何かを見つけると予想しているので、それらを非同期に実行したいのです。分割IProgressMonitor非同期

しかし、私はその目標をどのように達成するのか苦労しています。 Eclipseの標準的な方法は、おそらくジョブを使用することです:

非同期的に大丈夫だが、ここでの問題は、各ジョブには独自の IProgressMonitorを持っているので、子育て検索がどのように進行に関する情報を得ることができないということです
@Override 
public IStatus run(final IProgressMonitor monitor) throws OperationCanceledException { 
    for (Delegate delegate : delegates) { 
     Job job = new Job(delegate.getName()) { 

      @Override 
      protected IStatus run(IProgressMonitor monitor) { 
       delegate.run(monitor); 
       return Status.OK_STATUS; 
      } 
     }; 
     job.schedule(); 
    } 
    return Status.OK_STATUS; 
} 

(仕事が終わったときに「終了」を除く)。また、私はこれらの仕事が同時に実行されるかどうかもわかりません。

私はSubMonitorを発見し、それは有望に見える:

@Override 
public IStatus run(final IProgressMonitor monitor) throws OperationCanceledException { 
    SubMonitor subMonitor = SubMonitor.convert(monitor, delegates.size()); 
    for (Delegate delegate : delegates) { 
     SubMonitor delegateMonitor = subMonitor.split(1); 
     delegate.run(delegateMonitor); 
    } 
    return Status.OK_STATUS; 
} 

は、しかし、今私は、これは非同期で動作するように取得する方法でstruggelingです。

これらのアプローチを組み合わせて、ジョブのIProgressMonitorを無視しても、私は不正行為のように感じるかもしれません。

IProgressMonitorを非同期タスクに分割する最も良い方法は何ですか?

答えて

0

私はこのような状況に遭遇していないので、私の考えは実践的な経験に裏打ちされていません。

私の最初の選択は、1つのジョブをスケジュールし、すべての非同期タスク間で1つの進捗モニターを共有することです。タスクは完了した作業の量のみを報告することができます(つまり、worked()と呼んでください)。 beginTask()done()は、2番目のスニペットでスケッチされたように、ジョブからのみ呼び出されます。

FutureProgressMonitorを除いて、私が遭遇したIProgressMonitorの実装のどれもスレッドセーフではないようです。

したがって、スレッドセーフラッパーを実装する必要があります。それが適合するかどうかは、FutureProgressMonitorを調べてください。

さらに、ジョブはすべてのタスクが完了するまで待つ必要があります。ジョブのrun()メソッドからJob.ASYNC_FINISHを返すこともできますが、私はこれまで自分自身を使用していません。

関連する問題