2017-02-10 17 views
0

メイン質問:worker.addEventListenerからworker.postMessageを呼び出していますか?以下の例では、可能な限り短くしています。worker.addEventListenerに別のpostMessageを送信する

私は(私はそれを再利用することができます前に、作業員が初期化される。また、括弧は/*-{}-*/ことが、私はちょうど{}で行くシンタックスハイライトのためのためにすべきである)労働者とGWTのネイティブ機能を持っています。

private native void nativeWorkerCalls(JavaScriptObject worker, int cwidth, int cheight) { 
    console.log('Main: Pre draw'); 
    worker.postMessage({'cmd' : 'draw', 'args' : [cwidth*cheight] }); 

    worker.addEventListener('message', function(e) { 
     switch (e.data.cmd) { 
      case 'draw': 
       /* do some stuff */ 
       console.log('Main: Pre clear'); 
       worker.postMessage({'cmd' : 'clearBuffer', 'args' : [e.data.offset]}); // I call the worker again! 
       break; 
      case 'clearBuffer': 
       console.log("%c Main: Post clear", 'background: #222; color: #00ffae'); 
       break; 
      default: 
       break; 
     }; 
     console.log("Main: ### Finished listener ###"); 
    }, false); 
}; 

と、次のworker.js渡された「CMD」に応じて、異なるスイッチの例を実行するスクリプトを。

importScripts("emscripten.js"); 

self.addEventListener('message', function(e) { 
    var data = e.data; 
    switch (data.cmd) { 
     case 'draw': 
      /* assign some buffer, draw into it */ 
      self.postMessage({ 'cmd' : 'draw', buffer : mb, offset : buffer}); 
      break; 
     case 'clearBuffer': 
      /* clear buffer */ 
      console.log('Main: Pre clear'); 
      self.postMessage({'cmd' : 'clearBuffer'}); 
      break; 
     default: 
      self.postMessage(null); 
     }; 
}, false); 

問題:初めてネイティブ関数を実行したときはすべて問題ありません。しかし、それ以降の呼び出しには、worker.jsのeventlistenerが繰り返し呼び出されるという副作用があります。

メイン::次の呼び出しを行う必要があり

一つの実行前には

ワーカーを描く:

メインドロー:描くポストを

メイン:明確な

メインを事前: ###完成したリスナー###

ワーカー:無料バッファ

メイン:ポスト明らか

メイン:###完成リスナー###秒の時間が私にあまりにも多くのコールを与えるボタンを押す

- それは別の引き分けを追加します(これは何もしていないようだ)とも(労働者がその後、すでに解放されたバッファを解放しようとするため、エラーに実行される)別の明確なを追加します。

メイン:事前描く

ワーカー:

メインドロー:投稿描く

メイン:明確な

メインを事前:###完成リスナーを###

メイン:ポスト描く

メイン:プレクリア

メイン:###完成したリスナー###

ワーカー:無料バッファ

メイン:ポスト明らか

メイン:###完成リスナー###

メイン:ポスト明らか

メイン:###完成リスナー# ##

ワーカー:無料バッファ

答えて

0

私の代わりに愚かな間違い。これらの余分な呼び出しがあったのは、私がイベントリスナーを作業者に追加し続けていたためです。明らかに私は、イベントリスナーを追加して、私がワーカーをインスタンス化し、ワーカーを渡すことができるようにする必要があります。

2

はい、それは悪いです、任意のメッセージングシステムでの3方向の往復は、プロトコル発見のようなものを除いて、アンチパターンです。

これを回避するには、メインスレッドで状態を集中化し、派生データを含むすべてのデータを一度に送信します。

+0

私はこの3ウェイ旅行を避けるでしょう。しかし、私はこの余分な呼び出しを持っていた理由は、他のものだった:) – Philipp

関連する問題