Использование функции ctypes в Firefox ChromeWorker

Я пытаюсь использовать 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» печатается. Это похоже на то, что я получаю тихий сбой от одной из этих других строк, но это точный код, который я использовал для запуска этого из main.js, прежде чем я попытался использовать ChromeWorker.

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


person Derek    schedule 25.11.2014    source источник


Ответы (1)


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

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

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

person Noitidart    schedule 26.11.2014
comment
Отлично, спасибо за информацию. Я проверю ваш github и сообщу, если у меня что-то получится! - person Derek; 26.11.2014
comment
дополнительный вопрос: Итак, я получил этот workign, и я действительно могу, наконец, заставить свою библиотеку ctypes запускаться из ChromeWorker благодаря вашему предложению (передав ему сообщение с запуском и т. д.). Однако мой библиотечный вызов launch_stun() выполняется уже давно. Если я помещу postMessage() после него, я никогда не увижу его обратно в моем main.js, это проблематично для бесконечных команд, потому что как я могу отправить сообщение в ChromeWorker, чтобы выгрузить библиотеку и остановить вызов функции? Могу ли я каким-то образом глобально загрузить/выгрузить библиотеку ctypes из main.cs? - person Derek; 26.11.2014
comment
Выполнение worker.terminate() — это интересная мысль, чтобы отменить все, что делает работник, я не уверен, что это так работает, мы должны опубликовать еще один вопрос об этом, возможно, по адресу ask.mozilla.org там много знают. - person Noitidart; 26.11.2014
comment
Вы не получаете postMessage после завершения launch_stun? Под длительным выполнением вы подразумеваете, что оно никогда не завершается, пока не будет прекращено? - person Noitidart; 26.11.2014
comment
Правильно - то, что я на самом деле запускаю, - это прослушиватель сокетов. Так что он будет слушать вечно, пока что-то не скажет ему остановиться. Действительно ли мне нужно объявить мою функцию ctypes глобально, чтобы рабочий процесс не перезагружал DLL каждый раз при повторном входе? - person Derek; 01.12.2014
comment
О круто я вижу. Я не уверен, что вы имеете в виду, человек, загружая глобально, чтобы он не перезагружал DLL, можете ли вы пояснить, пожалуйста - person Noitidart; 02.12.2014
comment
Я имею в виду, что DLL загружается в ChromeWorker. Вызов функции сделан, и он работает бесконечно. Это означает, что сам ChromeWorker заморожен и больше не может получать postMessage() или делать что-либо еще. Когда я нажимаю кнопку остановки, мне нужен способ сообщить ChromeWorker о прекращении работы, независимо от возврата функции C. Если бы у меня была загрузка DLL из основного потока, я мог бы заставить его выйти, выгрузив DLL, я думаю - person Derek; 02.12.2014
comment
О, я вижу! Я думаю, вам придется worker.terminate и перезагрузить dll, когда вы перезапустите chromeworker :( Другой способ, возможно, заставить вашу dll что-то опросить. - person Noitidart; 02.12.2014
comment
Привет, @Derek, я слышал, что кто-то еще подумал о том, чтобы добавить асинхронность в dll следующим образом: using pthreads when the SPF_ASYNC flag is specified. Я не парень C, но как вы думаете, это поможет вам? - person Noitidart; 12.12.2014
comment
Я буду смотреть в него. На самом деле я использовал именованные каналы для связи с DLL. Он опрашивает сервер именованных каналов, запрашивая статус, а затем может завершить работу, если получит сообщение о завершении работы. Надстройка firefox может либо напрямую обращаться к именованному каналу (я думаю), либо использовать отдельный процесс C для доступа к именованному каналу, чтобы отправить стоп-сообщение или что-то еще (что я сделал) - person Derek; 12.12.2014