gpt4 book ai didi

javascript - Emscripten webworker - 自己的消息和依赖项

转载 作者:行者123 更新时间:2023-11-30 05:30:35 28 4
gpt4 key购买 nike

我有一个 C++ 项目,我使用 emscripten 将其编译为 Javascript。但是,由于资源限制和交互性原因,我想在 webworker 中运行它。

但是,我的项目使用标准输入。我找到了一种方法,通过用一个函数覆盖 Module['stdin'] 来提供我自己的 stdin 实现,该函数在整个 stdin 的时间返回一个字符,并以 0 作为 EOF 结束。当脚本在页面内运行时,这会起作用,因为 html 文件中存在的 Module 对象与脚本共享。

当你作为一个 webworker 运行时,这个模块对象是不共享的。相反,消息传递确保 Module 的常规功能仍然有效。这不包括“标准输入”。

我通过修改输出 javascript 解决了这个问题:

  • A:添加包含此标准输入规范的模块对象的实现。此函数被修改为读取 webworker 的变量,就好像它是标准输入一样,并在每个字符的基础上提供它。
  • B:更改 webworker 的 onmessage 以调用附加函数来处理我自己的事件。
  • C:这个附加函数通过设置我指定的标准输入函数读取的变量来监听事件并在事件是标准输入的内容时使用react。
  • D:添加和删除对此附加事件的运行依赖性,以防止 c++ 代码在未指定标准输入的情况下运行。

在代码中:

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,并推出你自己的。所有细节可能都超出了单个问题的范围,但在较高层次上,您需要...

作为旁注,我发现 Emscripten 提供的用于 JavaScript 功能的 C++ 包装器,例如 workers、图形、音频、http 请求等,一开始很好用,但有局限性公开技术上可能的一切。我经常不得不自己动手来获得所需的功能。虽然不是出于同样的原因,但我也不得不为工作人员编写自己的 API。

关于javascript - Emscripten webworker - 自己的消息和依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35937676/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com