- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 C++ 项目,我使用 emscripten 将其编译为 Javascript。但是,由于资源限制和交互性原因,我想在 webworker 中运行它。
但是,我的项目使用标准输入。我找到了一种方法,通过用一个函数覆盖 Module['stdin'] 来提供我自己的 stdin 实现,该函数在整个 stdin 的时间返回一个字符,并以 0 作为 EOF 结束。当脚本在页面内运行时,这会起作用,因为 html 文件中存在的 Module 对象与脚本共享。
当你作为一个 webworker 运行时,这个模块对象是不共享的。相反,消息传递确保 Module 的常规功能仍然有效。这不包括“标准输入”。
我通过修改输出 javascript 解决了这个问题:
在代码中:
Module['stdin_pointer'] = 0;
Module['stdin_content'] = "";
Module['stdin']=(function () {
if (Module['stdin_pointer'] < Module['stdin_content'].length) {
code = Module['stdin_content'].charCodeAt(Module['stdin_pointer']);
Module['stdin_pointer']=Module['stdin_pointer']+1;
return code;
} else {
return null;
}
});
external = function(message){
switch(message.data.target){
case 'stdin' : {
Module['idpCode'] = message.data.content;
removeRunDependency('stdin');
break;
}
default: throw 'wha? ' + message.data.target;
}
};
[...]
addRunDependency("stdin");
[...]
//Change this in the original onmessage function:
// default: throw 'wha? ' + message.data.target;
//to
default: {external(message);}
显然,这个 a & c 部分很容易,因为它可以添加到 js 文件的开头(或接近开头),但是 b & d(添加你自己的依赖项并在循环中获取你自己的消息处理程序)要求您内联编辑代码。由于我的项目非常大,找到必要的行进行编辑可能非常麻烦,在优化和模拟的 emscripten 代码中更是如此。执行此操作的自动脚本以及解决方法本身可能会在新的 emscripten 版本上中断。
是否有更好、更合适的方法来实现相同的行为?
谢谢!
//编辑:--separate-asm
标志非常有用,因为我必须编辑的文件现在只有几行长(以简化形式)。大大减轻了负担,但仍然不是一个正确的方法,所以我不愿意将其标记为已解决。
最佳答案
我知道实现你想要的唯一方法是不使用 Emscripten 提供的工作 API,并推出你自己的。所有细节可能都超出了单个问题的范围,但在较高层次上,您需要...
使用您的处理代码编译工作模块,但不使用 BUILD_AS_WORKER 标志
在 UI 和 worker 端,您需要使用 http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html 中的一种技术编写一些 JavaScript 代码来与 C++ 世界进行通信。 ,然后直接调用 JavaScript worker API https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Using_web_workers
在 Worker 端,您将能够控制 Module 对象,根据需要设置 stdin
作为旁注,我发现 Emscripten 提供的用于 JavaScript 功能的 C++ 包装器,例如 workers、图形、音频、http 请求等,一开始很好用,但有局限性公开技术上可能的一切。我经常不得不自己动手来获得所需的功能。虽然不是出于同样的原因,但我也不得不为工作人员编写自己的 API。
关于javascript - Emscripten webworker - 自己的消息和依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35937676/
我需要将什么添加到我的 CMakeLists.txt 文件中,以便下面的示例来自 here还能建吗? 我可以毫无问题地生成 WASM,但不知道要在我的 CMakeLists.txt 中添加什么以停止出
我很好奇 emscripten 是否可以在没有 libc 的情况下构建二进制文件。 如果我有 simple.c: int add1(int x) { return x + 1; } 而且我不想
我已经研究了一段时间,我似乎无法找到如何实现这一点。 有一个非常明确的标题 emscripten_get_canvas_size,它没有做我期望它做的事情。实际的 Emscripten Canvas
Emscripten 教程很好地解释了如何与 C 函数交互:https://github.com/kripken/emscripten/wiki/Interacting-with-code 但是你如何
我对 WebAssembly 非常感兴趣,但我感到沮丧的是,即使是用 C++ 编码并使用 Emscripten 编译的“Hello World”示例,也会在浏览器中加载总共 396KB。是什么赋予了?
game engine我用来运行我的 game在浏览器中运行 lua 并在我的游戏中使用正常的 fopen/write/fclose 保存文件。引擎C/C++代码通过emscripten编译为JS。让
当使用不带任何参数的 emscripten 编译 C++ 时,除了 webgl Canvas 之外,它还会生成一个带有控制台和 emscripten Logo 的 html 文件。 是否可以禁用 Lo
我在 emscripten 中有一个 hello world 代码。如果可能的话,我想用 visual studio code 调试它并设置断点和调试更容易。我尝试这样做,但我无法在断点处停止。我使用
我正在阅读这里的 emscripten 教程 - https://github.com/kripken/emscripten/wiki/Tutorial 到目前为止,我已经下载了源代码并安装了依赖项并
是否可以使用 Emscripten 优化构建/编译 Opus/libopus?我不确定这是否是 Emscripten 和 WebAssembly 的一般当前限制,或者是否存在确保解码器在 WebAss
在 Emscripten wiki ( Interacting with code ) 中,只有两种类型被列为要传递给 ccall 的可能返回类型。或 cwrap (“数字”和“字符串”)。如何包装/
如何使用 emcmake cmake 并传递 emscripten 命令行选项? C++/CMake 的新手,但在谷歌上找不到任何有用的东西。所以也许这个问题只是愚蠢的,在那种情况下我道歉。 我可以使
我是 opencv.js 的新手。我在构建 opencv.js 时遇到了一些问题我正在使用 Windows 10。我按照以下步骤设置 opencv.js https://docs.opencv.org
我无法在另一个 JavaScript 文件中调用 C 函数,它给出了错误“在运行时初始化之前调用”please refer to this link 我按照给定链接中的描述在 emscripten 中
我正在尝试使用 Emscripten 构建一个使用 ffmpeg 库到 WebAssembly 的小项目。在此之前,我通过将一些简单的程序从 C 转换为 Wasm 来进行尝试,它运行良好,但那时我没有
我正在尝试将线程与 Emscripten 一起使用,但我不明白它是如何工作的。我已经阅读了一些关于网络 worker 的文字,但我不确定是否理解。 当我查看“tests”文件夹时,I can see
我正在运行一个使用 emscripten 编译为 wasm 的 C 工具。该工具适用于非常大的文件。在 CLI 上正常运行此工具时,操作通常会流式传输结果并在返回足够的数据后提前终止程序。例如,您可能
Mono 有一个 LLVM编译器。无论如何可以将它与 Emscripten 一起使用吗? (将 C# 代码编译为 JavaScript)? 最佳答案 目前没有现成的方法可以做到这一点。这也许是可能的,
我通过以下步骤安装了 Emscripten: 1.) Download the emsdk-portable version for Linux/MacOSX http://kripken.githu
我是 Emscripten/javascript 的新手,如果我的情况已经得到解决,我提前道歉。我在 ionic3 中有一个应用程序,我想读取 c 中有 3 个位置的数组,这个位置有其他数组,在结构上
我是一名优秀的程序员,十分优秀!