我已将我的程序编译成单个 program.js
文件,并在 worker 中调用:
importScripts('program.js');
Module.callMain();
但是,虽然 callMain
正在执行,但在该函数调用的堆栈中我收到了 Undefined is not a function
错误。
我的直觉是我还没有阅读一些重要的 emscripten 文档、wiki 或源代码。
我所知道的:
- emscripten 具有与 worker 一起工作的绑定(bind),但只有在主线程上有一个 emscripted 进程才能使用这些绑定(bind)时(参见 emscripten.h )
- 为了将任务(在主线程上运行的库中)编译给 worker,
emcc
需要在编译时为该任务传递特殊选项 (参见 settings.js )
我的推测:
- 我可能需要传递一些标志,让 emcc 知道不要在不存在的对象上调用函数,例如
window
- 查看了
/dev/tty
的实现,它由/dev/stdin
链接,以及/dev/stdout< 的实现
,我相信可能会有输出到console
,我认为 worker 不支持它
我要问的是:
- 如何在 worker 中使用我的库(单个 js 文件)?
- 我的库从
program.data
文件加载其他文件,如果有差异的话
- 我的库从
提前致谢。如果我可以添加任何详细信息,请告诉我。
注意:顶部的代码是简化的 - 它似乎不是语法错误。
更新:
- 堆栈跟踪 (
Error.stack
) 仅告诉我错误发生在Module.callMain
中。它没有告诉我有关可能导致它的导入脚本的任何信息。 :(
最佳答案
Emscripten 输出应该在网站、网络 worker 或节点上运行,所有这些都无需修改。可能会有一些限制(例如,没有 Canvas 可以在 worker 中渲染),但除此之外,它只是可以在这三种环境中运行的纯 JS。
emscripten 生成的完全相同的 JS 文件是否可以在 worker 之外工作?
如果 callMain()
失败,请检查您的项目是否具有 main()
函数。
关于javascript - 如何在 Web Worker 中使用 emscripted .js 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24968718/