2014-11-25 1 views
2

Я пытаюсь использовать ChromeWorker запустить фоновый процесс, например, так:Использование ctypes функции в FireFox 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 и такие? Интересно, что в шоковом-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" никогда не выводятся на экран, и "Message 1" есть. Это похоже на то, что я получаю тихую неудачу с одной из этих других строк, но это точный код, который я использовал для запуска этого из main.js, прежде чем я попытался использовать ChromeWorker.

Любые идеи? Я думаю, похоже, что stun-manager.js терпит неудачу, и по соответствующей заметке я даже не могу найти его в браузере Toolbox для отладки, но я вижу файл main.js там.

ответ

2

Два простых примеров использования ChromeWorker (а также продвижение ChromeWorker, PromiseWorker, который качается, кстати):

Вы не можете сделать var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm") в рабочем (ваш рабочий stun-manager.js). Это вызывает ошибку, удаляет ее. Вы можете просто использовать ctypes, не импортируя ничего, у ChromeWorker его автоматически есть. Это должно исправить это.

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

+0

Отлично, спасибо за информацию. Я проверю ваш github и отчитаюсь, если я смогу что-то сделать! – Derek

+0

следующий вопрос: Итак, я получил этот workign, и я действительно могу наконец получить мою библиотеку ctypes для запуска из ChromeWorker благодаря вашему предложению (передав сообщение ему с «start» и т. Д.). Тем не менее, вызов библиотеки в launch_stun() длится долго. Если я поместил postMessage() после него, я никогда не увижу его в моем main.js, это проблематично для бесконечно запущенных команд, потому что как я могу отправить сообщение в ChromeWorker, чтобы выгрузить библиотеку и остановить вызов функции? Могу ли я загружать/выгружать библиотеку ctypes глобально каким-либо образом из main.cs? – Derek

+0

Выполнение 'worker.terminate()' является интересной мыслью отменить все, что делает рабочий, я не уверен, что так оно и работает, мы должны опубликовать еще один вопрос об этом, возможно, по адресу http: // ask. mozilla.org они много знают. – Noitidart