在firefox ChromeWorker中使用ctypes函数

在firefox ChromeWorker中使用ctypes函数,firefox,firefox-addon,firefox-addon-sdk,jsctypes,Firefox,Firefox Addon,Firefox Addon Sdk,Jsctypes,我正在尝试使用ChromeWorker启动后台流程,如下所示: var worker = new ChromeWorker(data.url("stun-manager.js")); worker.addEventListener('message', function(e) { console.log(e.data); }, false); worker.postMessage({'cmd': 'start', 'msg': 'Hi'}); 但是我到底在哪里声明我所有的ctypes

我正在尝试使用ChromeWorker启动后台流程,如下所示:

var worker = new ChromeWorker(data.url("stun-manager.js"));
worker.addEventListener('message', function(e) {
    console.log(e.data);
}, false);

worker.postMessage({'cmd': 'start', 'msg': 'Hi'});
但是我到底在哪里声明我所有的ctypes之类的东西呢?有趣的是,在stun-manager.js中,如果我有以下内容:

dump ("Message 1");
var {Cu} = require("chrome");
dump ("Message 2");

/*import js-ctypes */
var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm")
var stun_driver = ctypes.open("C:\\Users\\derek_000\\Documents\\Visual Studio 2012\\Projects\\stunnel507\\stunnel507\\bin\\win32\\stun_driver.dll");

const launch_stun = stun_driver.declare("launch_stun", ctypes.default_abi, ctypes.int32_t,  ctypes.int32_t, ctypes.char.ptr.ptr);

let argv_t = ctypes.ArrayType(ctypes.char.ptr);
let argc = 2;
let argv = new argv_t(argc);
var conf_path = "C:\\Users\\derek_000\\Documents\\Visual Studio 2012\\Projects\\stunnel507\\stunnel507\\stunnel.conf";
argv[0] = ctypes.char.array()(conf_path);
argv[1] = ctypes.char.array()(conf_path);

self.addEventListener('message', function (e) {
    var data = e.data;
    switch (data.cmd) {
        case 'start':
            self.postMessage("Value of launch_stun " + self.launch_stun);
            self.postMessage('WORKER STARTED: ' + data.msg);
            self.postMessage("debug" + self.argv_t);
            self.postMessage("test: " + self.argv_t);
            self.postMessage(self.argv[0].readString());
            launch_stun(argc, argv );
            break;
        case 'stop':
            self.postMessage('WORKER STOPPED: ' + data.msg +
                             '. (buttons will no longer work)');
            self.close(); // Terminates the worker.
            break;
        default:
            self.postMessage('Unknown command: ' + data.msg);
    };
}, false);
“消息2”永远不会打印到屏幕上,“消息1”也不会打印到屏幕上。这几乎就像我从其他几行中得到了一个无声的失败,但这正是我在尝试使用ChromeWorker之前从main.js启动此程序时使用的代码


有什么想法吗?我猜stun-manager.js似乎正在悄无声息地失败,在相关的注释中,我甚至无法在浏览器工具箱中找到它进行调试,但我确实在那里看到了我的main.js文件

两个简单的使用ChromeWorker的例子(也是ChromeWorker的一个进步,PromiseWorker,顺便说一句,它很震撼):

您不能执行
var{ctypes}=Cu.import(“resource://gre/modules/ctypes.jsm)
(您的工作人员是
stun-manager.js
)。这会导致错误,请删除它。您只需使用
ctypes
而无需导入任何内容,ChromeWorker自动拥有它。这应该可以解决问题


我将详细查看您的代码,但一定要查看ChromeWorker repo。这将非常有帮助,这是worker和main之间非常基本的消息传递方式。

太好了,谢谢您提供的信息。我会检查你的github,如果我能找到工作,我会回来报告!后续问题:所以我得到了这个工作标记,而且我确实能够最终从ChromeWorker启动我的ctypes库,这要感谢您的建议(通过向它传递一条带有“start”等的消息)。但是,我对启动_stun()的库调用正在长时间运行。如果我在它后面放一条postMessage(),我永远不会在main.js中看到它,这对于无限运行的命令来说是有问题的,因为我如何向ChromeWorker发布消息以卸载库并停止函数调用?我可以从main.cs全局加载/卸载ctypes库吗?执行
worker.terminate()
是一个有趣的想法,可以取消worker正在执行的任何操作,我不确定它是否是这样工作的,我们应该发布另一个问题,也许在那边,他们知道很多。你在发布完成后没有收到邮件吗?长时间运行是指直到终止它才会完成吗?正确-我实际上启动的是一个套接字侦听器。所以它会一直听,直到有东西告诉它停止。我真的需要全局声明我的ctypes函数吗,这样工人就不会在每次重新输入DLL时重新加载它了?