2017-02-10 60 views
0

主要問題:正在調用worker.postMessage from worker.addEventListener不好?下面的例子,我儘量保持儘可能短。在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腳本,應根據「加利福尼亞」通過執行不同的開關情況。

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

愚蠢的錯誤代表我。爲什麼我有這些額外的電話是因爲我不斷向工作人員添加事件監聽器。很顯然,我需要添加事件監聽器,在其中實例化worker,然後我可以傳遞該worker。

2

是的,它是不好的,任何消息傳遞系統中的3路往返都是反模式,除了協議發現之外。

爲了避免在主線程中集中您的狀態並一次發送包括派生數據的所有數據。

+0

我會避免這種3路旅行。但爲什麼我有這個額外的電話是別的東西:) – Philipp