2012-02-29 2 views
3

Я пишу расширение Firefox с помощью Add-on-builder и Add-on SDK. До сих пор мне удалось обойти любые ограничения, не переходя на XUL. Но я столкнулся с препятствием.Параллелизм и многопоточность в расширениях Firefox

У меня есть длительный процесс, который может блокироваться, поэтому мне нужно отделить эту обработку от основного потока пользовательского интерфейса. Я прочитал вопрос here, но он не совсем отвечает на мой вопрос. Работникам Web недостаточно, поскольку для долгого процесса требуется доступ к js-ctypes и собственному коду. Таким образом, казалось бы, ChromeWorker может сделать трюк. Но я не знаю, как получить доступ к нему из Add-on-builder. Кроме того, диспетчер потоков доступен только через код C++. Как я могу либо:

  1. доступа и экземпляр Chrome Рабочие (или)
  2. Создать темы (или)
  3. Поддельный параллелизм (как-то)

, чтобы избежать блокирования потока пользовательского интерфейса. В качестве альтернативы, я мог бы свернуть свой собственный код (который я пытаюсь избежать).

ответ

6

Вы должны использовать хромированных рабочих, они предназначены специально для использования js-ctypes в другой теме. У менеджера потоков есть проблемы, и использование его из JavaScript было запрещено. Основная проблема заключается в том, что конструктор ChromeWorker не отображается в дополнительных модулях SDK. Но вы можете получить его из chrome псевдо-модуля:

var self = require("sdk/self"); 
var {ChromeWorker} = require("chrome"); 
var worker = new ChromeWorker(self.data.url("worker.js")); 

Это работает только начиная с Firefox 8, в более ранних версиях вы бы use the worker factory. Но я предполагаю, что вам это не нужно - новые версии SDK Add-on не поддерживают ничего под Firefox 9 в любом случае.

Примечание: Вы должны убедиться, чтобы закрыть этот рабочий, если ваша надстройка отключена или удалены (например, с использованием unload module), это не будет происходить автоматически.

Редактировать: Matthew Ruttley описывает более простой подход к импорту хромовых рабочих в его detailed blog post, я обновил этот ответ соответственно.

+0

Спасибо. Как создать модуль JavaScript с помощью Addon builder? Возможно ли создать его как часть расширения? Или мне нужно создать публичную библиотеку для экспорта ChromeWorker? Еще раз спасибо! – plin

+0

@plin: см. Мой пример кода ... Вам не нужно создавать модуль, их уже достаточно. Вам нужны только их, чтобы получить конструктор 'ChromeWorker', после чего вы можете просто использовать его. –

+0

Я попытался создать библиотеку и экспортировать ChromeWorker. Я смог получить к нему доступ, но хотя создание нового ChromeWorker создало рабочего, я не мог отправлять или получать сообщения между моим основным сценарием и рабочим сценарием. – plin

Смежные вопросы