2012-02-29 51 views
3

我正在使用加載項構建器和附加SDK編寫Firefox擴展。到目前爲止,我已經能夠解決任何限制而無需遷移到XUL。但是,我遇到了障礙。Firefox擴展中的併發和多線程

我的擴展有一個很長的運行過程,可能會阻塞,所以我需要將這個處理與主UI線程分開。我已閱讀here這個問題,但它不能完全回答我的問題。 Web Workers是不夠的,因爲長時間運行的過程需要訪問js-ctypes和本機代碼。所以,似乎ChromeWorker可能會伎倆。但是,我不知道如何從「加載項」構建器訪問它。此外,線程管理器只能通過C++代碼訪問。我無論怎樣才能:

  1. 訪問和實例鉻工人(或)
  2. 創建線程(或)
  3. 假併發(不知)

以避免阻塞UI線程。或者,我可以在自己的代碼中滾動我自己的代碼(我試圖避免)。

回答

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版本不支持Firefox 9以下的任何東西。

注意:如果您的加載項被禁用或卸載(例如使用unload module),您應該確保關閉此工作程序,它不會自動發生。

編輯:Matthew Ruttley描述了一種更簡單的方法來導入他的detailed blog post中的鉻工人,我相應地更新了這個答案。

+0

謝謝。我如何使用Addon構建器創建JavaScript模塊?是否有可能創建一個作爲擴展的一部分?或者,我是否需要創建一個公共庫來導出ChromeWorker?再次感謝! – plin 2012-03-01 06:22:52

+0

@plin:看我的代碼示例...你不需要創建一個模塊,已經有很多模塊可用。你只需要它們來獲得'ChromeWorker'構造函數,之後你就可以使用它。 – 2012-03-01 07:05:22

+0

我嘗試創建一個庫並導出ChromeWorker。我能夠訪問它,但雖然實例化新的ChromeWorker創建了一個worker,但我無法在我的主腳本和worker腳本之間發佈或接收任何消息。 – plin 2012-03-01 07:12:39