メイン質問: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が繰り返し呼び出されるという副作用があります。
メイン::次の呼び出しを行う必要があり
一つの実行前には
ワーカーを描く:
メインドロー:描くポストを
メイン:明確な
メインを事前: ###完成したリスナー###
ワーカー:無料バッファ
メイン:ポスト明らか
メイン:###完成リスナー###秒の時間が私にあまりにも多くのコールを与えるボタンを押す
- それは別の引き分けを追加します(これは何もしていないようだ)とも(労働者がその後、すでに解放されたバッファを解放しようとするため、エラーに実行される)別の明確なを追加します。
メイン:事前描く
ワーカー:
メインドロー:投稿描く
メイン:明確な
メインを事前:###完成リスナーを###
メイン:ポスト描く
メイン:プレクリア
メイン:###完成したリスナー###
ワーカー:無料バッファ
メイン:ポスト明らか
メイン:###完成リスナー###
メイン:ポスト明らか
メイン:###完成リスナー# ##
ワーカー:無料バッファ
私はこの3ウェイ旅行を避けるでしょう。しかし、私はこの余分な呼び出しを持っていた理由は、他のものだった:) – Philipp