2011-09-09 25 views
2

私はWebブラウザで動作するJavascriptシミュレータを使用しています。これは、メインループがあります。すべてのプロセスが終了するまで待ちます

do { 
    updateVisualization(simulator); 
    simulator.doStep(); 
} while (!reachedGoal(simulator)); 

そして、すべての反復のために、私は同時に実行されなければならないいくつかの労働者を実行する必要があります。

​​

を私の質問は:私は最後まで、すべての労働者のために待つことができますか?

+0

Webワーカーのアイデアは、バックグラウンドで実行させ、終了時にハンドラ(=コールバック)を実行させることです。 whileループ(UIをブロックする)を使用すると、Webワーカーの目的はすべて失われます。 –

+0

各繰り返しで新しいワーカーセットを作成していますか?すべての反復で同じ組の労働者を再使用できませんでしたか? –

+0

私はシミュレータをC#からJavascriptに移行しているので、多分改善することができます。私はワーカーを再利用しようとしますが、UIをブロックするwhileループを削除する方法についてはまだ考えています。ありがとう。 –

答えて

4

提案:

doStep = function() { 
    var i, worker; 

    updateVisualization(simulator);  

    simulator.workers = []; // array of workers for this step 

    for (i = 0; i < agents.length; i++) { 
     // set up new worker 
     worker = new Worker('worker.js'); 
     worker.onmessage = function (e) { 
      var i; 

      if (e.data === 'finished') { 
       this.finished = true; 

       for (i = 0; i < simulator.workers.length; i++) { 
        if (!simulator.workers[i].finished) { 
         return; 
        } 
       } 

       // survived for-loop = all workers finished 
       if (!reachedGoal(simulator)) { // another iteration? 
        simulator.doStep();  
       } 
      } 
     }; 
     worker.postMessage('doStep'); 

     simulator.workers.push(worker); // push worker into workers array 
    } 
}; 

だから、すべてのアクションは、労働者のonmessageコールバックで発生します。作業者がメッセージで応答するたびに、すべての作業者のfinishedプロパティがtrueに設定されているかどうかをチェックして、simulator.workersアレイを検査します。そうであれば、これはすべての労働者が作業を終え、あなたが進めることができることを意味します(「生き残ったfor-loop」の部分)。

基本的に、すべてのワーカーをインスタンス化してから、応答を待つだけです...ループは必要ありません。

+0

偉大なアンサー、Šime。コールバックを使用してwhileループを回避する方法を知ることは、大いに役立ちます。私はそれを二度投票することができればと思います。 –

+0

@Guido Cool ':)'他の誰かがコードを完全に理解できない場合に備えて、テキストによる説明を追加しました。 –

関連する問題