Главный вопрос: вызывает 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: Свободный буфер
Я буду избегать этой поездки в 3 направлениях. Но причина, по которой у меня были эти дополнительные звонки, была чем-то еще :) – Philipp