8

私はこの例を理解しようとしています:

HTML(メインコード):

   <html>  
     <title>Test threads fibonacci</title>  
     <body>  

     <div id="result"></div>  

     <script language="javascript">  

       var worker = new Worker("fibonacci.js");  

       worker.onmessage = function(event) {  
         document.getElementById("result").textContent = event.data;  
         dump("Got: " + event.data + "\n");  
       };  

       worker.onerror = function(error) {  
         dump("Worker error: " + error.message + "\n");  
         throw error;  
       };  

       worker.postMessage("5");  

     </script>  
     </body>  
   </html> 

Javascript(ワーカーコード):

   var results = [];  

   function resultReceiver(event) {  
     results.push(parseInt(event.data));  
     if (results.length == 2) {  
       postMessage(results[0] + results[1]);  
     }  
   }  

   function errorReceiver(event) {  
     throw event.data;  
   }  

   onmessage = function(event) {  
     var n = parseInt(event.data);  

     if (n == 0 || n == 1) {  
       postMessage(n);  
       return;  
     }  

     for (var i = 1; i <= 2; i++) {  
       var worker = new Worker("fibonacci.js");  
       worker.onmessage = resultReceiver;  
       worker.onerror = errorReceiver;  
       worker.postMessage(n - i);  
     }  
  };  

次の質問があります。

  • 正確にワーカーコードが実行を開始するのはいつですか?var worker = new Worker("fibonacci.js");?の実行直後

  • onmessage = function(event) { ... }ワーカーコードでの割り当てがworker.postMessage("5");メインコードで以前に実行されるというのは本当ですか?

  • ワーカーコードは、メインコード(などworker)で定義されているグローバル変数にアクセスできますか?

  • メインコードは、ワーカーコード(などresults)で定義されているグローバル変数にアクセスできますか?

  • メインコードでは、ワーカーコード(ワーカーのイベントハンドラー)worker.onmessage = function(event) {...}と同じ意味を持っているように見えます。私はどこが間違っていますか?それらの違いは何ですか?onmessage = function(event) {...}onmessage

  • このコードは実際に何をすべきですか?ここで実行すると、「5」と出力されます。それはそれがすることになっていることですか、それとも私は何かが欠けていますか?

どうもありがとう !

4

2 に答える 2

8

一般的なチュートリアルについては、HTML5 Rocks:The Basics ofWebWorkersをご覧ください。

  • postMessageワーカーのメソッドを呼び出すとすぐにワーカーが起動します。
  • onmessageメインコードでworkerにバインドされた関数は、workerがを呼び出すときに機能しますpostMessage
  • グローバル変数はメインスレッドとワーカースレッドの間で共有されません。データを渡す唯一の方法は、を介したメッセージングを介することpostMessageです。
  • ご想像のとおり、onmessageワーカーコードとメインコードの両方で同じ意味があります。これは、スレッドがメッセージイベントを受信したときのイベントハンドラーです。代わりに、イベントaddEventListenerをキャッチして使用することもできます。message

メインコード:

function showResult(event) {  
   document.getElementById("result").textContent = event.data;  
   dump("Got: " + event.data + "\n");  
}
var worker = new Worker("fibonacci.js");
worker.addEventListener('message', showResult, false);

ワーカーコード:

addEventListener('message', resultReceiver, false);

あなたが取ったフィボナッチの例は、再帰的なワーカーの例です。ワーカーを使用しない場合は、次のようになります。

function fibonacci(n) {
    if (n == 0 || n == 1) return n;
    return fibonacci(n-1) + fibonacci(n-2);
}

var result = fibonacci(5);
dump("Got: " + result + "\n");

(ああ、私はあなたのためにスタックレスをするつもりはありません。あなたはそれを自分で書きます!)

于 2011-04-18T17:34:44.477 に答える
1

また、ChromiumベースのブラウザーでのみWebワーカーをデバッグできることも付け加えておきます。開発者パネルで[ソース]を選択し、右側の列で一番下の行の[ワーカー]を展開して、[開始時に一時停止]チェックボックスを選択する必要があります。

于 2013-08-10T16:51:52.583 に答える