如何在Web Worker中使用emscripted .js库

时间:2014-07-26 07:36:14

标签: javascript web-worker emscripten

我已将我的程序编译成单个program.js文件,在工作人员中,我致电:

importScripts('program.js');
Module.callMain();

但是,虽然callMain正在执行,但在该函数调用的堆栈中,我收到Undefined is not a function错误。

我的预感是,我还没有阅读一些必要的 emscripten 文档,wiki或源代码。

我所知道的:

  • emscripten 具有与worker一起使用的绑定,但只有在主线程上有一个emscripted进程才能使用这些绑定时(参见emscripten.h
  • 为了将一个任务(在主线程上运行的库中)编译到一个worker,emcc需要在编译时为该任务传递的特殊选项(参见{{ 3}})

我猜测:

  • 我可能需要传递一些标志,让emcc知道不要在不存在的对象上调用函数,例如window
  • 查看/dev/tty的实施情况,/dev/stdin与[{1}}相关联的实施情况,以及/dev/stdout的实施情况,我相信可能会有console的输出,我不相信工人会支持

我在问什么:

  • 如何在工作人员中使用我的库,单个js文件?
    • 我的库从program.data文件加载其他文件,如果这有所不同

提前致谢。如果我可以添加任何细节,请告诉我。


注意:顶部的代码已经过简化 - 它似乎不是语法错误。

更新

  • 堆栈跟踪(Error.stack)只告诉我Module.callMain发生了错误。它没有告诉我有关可能导致它的导入脚本的任何信息。 :(

2 个答案:

答案 0 :(得分:2)

Emscripten输出应该在网站,网络工作者或节点中运行,所有这些都无需修改。可能存在一些限制(例如,在工作器中没有要渲染的画布),但除此之外,只有纯JS可以在这三种环境中运行。

emscripten生成的完全相同的JS文件是否在工作者之外工作?

如果callMain()失败,请检查您的项目是否有main()功能。

答案 1 :(得分:1)

加载js后立即(importScripts())它可能尚未执行,因此您尚未准备好。事情准备好后,您可以要求Emscripten为您拨打电话。您可以通过变量Module访问函数。

var Module = {
    preRun:[],
    onRuntimeInitialized: function load_done_callback() {
        console.info("The Module is loaded and is accessible here", Module);
        console.inf("no need to call main() though", Module._main); // add "_" before your function names
    },
};

importScripts('program.js');

无需致电callMain()Module._main(),我们会为您致电。您可能需要在编译器命令行中设置NO_EXIT_RUNTIME=1

em++  \
  -s EXPORTED_FUNCTIONS="['_main', '_myfunction1' , '_my_function2' ]" \
  -s NO_EXIT_RUNTIME=1 \
  -s DEMANGLE_SUPPORT=1 \
  program.cpp \
  -o ./program.js

请注意,在您使用importScripts()的情况下,您不需要编译为工作人员。