如何解决Emscripten:使用pthread时的自定义消息处理程序
TL; DR
如何在Emscripten生成的工作程序输出中添加消息处理程序?
我正在使用Emscripten将C ++终端应用程序移植到WASM,因此可以在浏览器中运行它。该应用程序正在阻塞并在内部使用线程,因此我使用PROXY_TO_PTHREAD
和USE_PTHREADS
进行了构建,这导致启动一个Web工作者来运行main
,另一个则为应用程序线程运行(这是Emscripten如何在浏览器中模拟pthread。
应用程序可能需要输入数据,为此,我需要将HTML元素中的文本输入到工作程序中,以提供应用程序的stdin
。使用Worker API,我可以使用postMessage
将数据发送到我的worker,但是我不知道如何在worker中添加消息处理程序!
有一个Module.onCustomMessage
属性可以做到这一点,但仅在使用PROXY_TO_WORKER
构建时才有效-使用pthreads时不允许。
我尝试过的另一种方法是非常 hacky,是尝试将onmessage函数包装在worker中:
EM_JS(int,malbolge_input,(char* buffer,int maxlen),{
return Asyncify.handleAsync(async () => {
if (typeof Module.malbolgeConfigured == "undefined") {
...
let standard_handlers = self.onmessage;
self.onmessage = function(e) {
console.log("\tWorker handler: " + e.data.cmd);
if (e.data.cmd === "input_text") {
Module.malbolgeInputQueue.push(e.data.input_text);
Module.malbolgeInputNotify();
} else {
standard_handlers(e);
}
};
}
...
不幸的是,只有原始函数被调用过,包装没有被调用,我也不知道为什么。
另一种替代方法是修补生成的*_worker.js
,以手动添加处理程序,但这是一种非常脆弱的解决方案,因为它将非常依赖于所使用的Emscripten版本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。