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

标签 javascript web-worker emscripten

我已将我的程序编译成单个 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/

相关文章:

javascript - new SharedWorker ("whatever.js") 返回错误?

pthreads - 线程使用 emscripten

javascript - dojo/date/locale - 空日期

php - 处理大格式输入中的 "Kill"

javascript - 由于我使用的是固定标题,如何才能停止在 div 之前平滑滚动 80px

javascript - 使用 JavaScript 和 HTML5 Web Workers 在用户不活动时触发 AJAX 请求

javascript - jQuery - 在选择框中选择选项

cordova - Phonegap 和 WebWorkers

javascript - 我怎样才能拥有类型的功能(arr : T[]) => T in C++ that compile to WebAssembly?

javascript - "emcc"命令无法识别