我正在使用附加构建器和附加 SDK 编写 Firefox 扩展。到目前为止,我已经能够解决任何限制,而无需迁移到 XUL。但是,我遇到了障碍。
我的扩展程序有一个长时间运行的进程,可能会阻塞,因此我需要将此处理与主 UI 线程分开。我已阅读问题here ,但它并不能完全回答我的问题。 Web Workers 还不够,因为长时间运行的进程需要访问 js-ctypes 和 native 代码。所以,看起来 ChromeWorker可能会成功。但是,我不知道如何从附加构建器访问它。此外,线程管理器只能通过 C++ 代码访问。我怎样才能:
- 访问并实例化 Chrome Workers(或)
- 创建线程(或)
- 假并发(以某种方式)
避免阻塞 UI 线程。或者,我可以在 native 代码中推出自己的代码(我试图避免这种情况)。
请您参考如下方法:
您应该使用 Chrome Worker,它们专门用于在不同线程上使用 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 中描述了一种导入 chrome 工作人员的更简单方法。 ,我相应地更新了这个答案。