2017-02-10 7 views
0

Главный вопрос: вызывает worker.postMessage от worker.addEventListener плохо? Пример ниже, я старался держать его как можно короче.Отправка другого сообщенияMessage в worker.addEventListener

У меня есть родная функция 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); 

Проблема: в первый раз, когда я запускаю нативную функцию, все в порядке. Но каждый последующий вызов имеет побочный эффект, который вызвал eventenerener в worker.js повторно.

Один прогон должен сделать следующие вызовы:

Главная: Pre рисовать

Worker: Draw

Главная: Пост рисовать

Main: Pre ясный

Main: ### Законченный слушатель ###

Работник: свободный буфер

Main: Сообщение ясно

Main: ### Закончено Слушатель ###

Нажатие кнопки во второй раз дает мне слишком много звонков - это добавляет еще один розыгрыш (который, кажется, не делать ничего), а также добавляет еще ясно (которая впадает в ошибку, потому что работник будет пытаться освободить буфер, который уже освобожденный):

Главная: Pre рисовать

работник: Draw

Main: Post рисовать

Main: Pre ясного

Main: ### Готового слушатель ###

Main: Post рисовать

Главного : Предварительная очистка

Главная: ### Законченный слушатель ###

Работник: свободный буфер

Main: Сообщение ясно

Main: ### Закончено Слушатель ###

Main: Сообщение ясно

Main: ### Закончено слушатель # ##

Worker: Свободный буфер

ответ

0

Глупая ошибка от моего имени. Причина, по которой у меня были эти дополнительные звонки, заключалась в том, что я продолжал добавлять слушателей событий к работнику. Очевидно, мне нужно добавить слушателя событий, где я создаю экземпляр рабочего, а затем я могу передать работника.

2

Да, это плохо, трехсторонняя поездка в любую систему обмена сообщениями - это анти-шаблон, за исключением таких вещей, как обнаружение протокола.

Чтобы избежать этого, централизовать свое состояние в основном потоке и сразу отправить все данные, включая производные данные.

+0

Я буду избегать этой поездки в 3 направлениях. Но причина, по которой у меня были эти дополнительные звонки, была чем-то еще :) – Philipp