JavaScript. Подробное руководство, 6-е издание, стр. 384
Роль «сокета» для разделяемого потока выполнения играет объект Messa-gePort. Он определяет прикладной интерфейс обмена сообщениями, подобный аналогичному интерфейсу в выделенных потоках выполнения, а также используемому для обмена сообщениями между документами с разным происхождением. Объект MessagePort имеет метод postMessage() и атрибут onmessage обработчика событий. Спецификация HTML5 предусматривает возможность создания связанных пар объектов MessagePort с помощью конструктора MessageChannel(). Вы можете передавать объекты MessagePort (в специальном аргументе метода postMessage()) другим окнам или другим фоновым потокам выполнения и использовать их как выделенные каналы связи. Объекты MessagePort и MessageChannel являются дополнительным прикладным интерфейсом, который поддерживается лишь немногими броузерами и здесь не рассматривается.
Наконец, объект
<b>WorkerGlobalScope</b><b>XMLHttpRequest(),</b><b>Worker()</b><b>Worker()</b>Некоторые прикладные интерфейсы HTML5, описываемые далее в этой главе, определяют особенности, доступные как через обычный объект
<b>Window</b><b>WorkerGlobalScope</b><b>Window</b><b>WorkerGlobalScope</b>22.4.3. Примеры использования фоновых потоков
Завершают этот раздел два примера использования фоновых потоков выполнения. Первый демонстрирует, как реализовать выполнение длительных вычислений в фоновом потоке, чтобы они не влияли на отзывчивость пользовательского интерфейса, обслуживаемого основным потоком выполнения. Второй демонстрирует, как можно использовать фоновые потоки для работы с простейшими синхронными прикладными интерфейсами.
В примере 22.6 определяется функция
<b>smear(),</b><b><img></b><b><canvas></b><b>ImageData</b><b><img></b><b><canvas></b><b>postMessage()</b><b>ImageData</b><b>Worker</b><b>postMessage</b><b><canvas>,</b><b>src</b><b><img></b>Пример 22.6. Создание фонового потока выполнения для обработки изображения
<b>// Асинхронная замена изображения его смазанной версией.</b><b>// Используется так: <img src="testimage.jpg" onclick="smear(this)"/> </b><b>function smear(img) {</b><b> // Создать неотображаемый элемент <canvas> того же размера, что и изображение</b><b> var canvas = document.createElement("canvas");</b><b> canvas.width = img.width;</b><b> canvas.height = img.height;</b><b> // Скопировать изображение в холст и извлечь его пикселы</b><b> var context = canvas.getContext("2d");</b><b> context.drawImage(img, 0, 0);</b><b> var pixels = context.getImageData(0,0,img.width,img.height)</b><b> // Отправить пикселы фоновому потоку выполнения</b><b> var worker = new Worker("SmearWorker.js"); // Создать фоновый поток</b><b> worker.postMessage(pixels); // Скопировать и отдать пикселы</b><b> // Зарегистрировать обработчик для получения ответа от фонового потока</b><b> worker.onmessage = function(e) {</b><b> var smeared_pixels = e.data; // Пикселы, полученные от потока</b><b> context.putImageData(smeared_pixels, 0, 0); // Скопировать в холст</b><b> img.src = canvas.toDataURL(); // А затем в изображение</b><b> worker.terminate(); // Остановить поток</b><b> canvas.width = canvas.height = 0; // Освободить память</b><b> }</b><b>}</b>В примере 22.7 приводится программный код реализации фонового потока, используемого в примере 22.6. Основу этого примера составляет функция обработки изображения: модифицированная версия примера 21.10. Обратите внимание, что этот пример настраивает свою инфраструктуру обмена сообщениями единственной строчкой программного кода: обработчик события onmessage просто накладывает эффект смазывания на изображение и сразу же отправляет его обратно.