Emscripten:使用pthread时的自定义消息处理程序

问题描述

TL; DR
如何在Emscripten生成的工作程序输出添加消息处理程序?


我正在使用Emscripten将C ++终端应用程序移植到WASM,因此可以在浏览器中运行它。该应用程序正在阻塞并在内部使用线程,因此我使用PROXY_TO_PTHREADUSE_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 (将#修改为@)