emscripten webassembly 更新进度条是运行?

Update progress bar during emscripten webassembly is running?

我想在 emscripten webassembly 期间显示进度条 运行。但是进度条会在 webassembly 完成后更新。有没有办法中断 webassembly(主线程)然后继续或强制 javascript(主线程)呈现 GUI?

main.js

Module.cwrap('calc', 'undefined', [])();

calc.cpp

void calc() {
   EM_ASM({ progressBar([=12=]); }, value); // here the progress bar should be updated immedately
   ...
   calc something
   ...
}
// but it's updated only here

我也试过

progressbar(val) {
   setTimeout(function(){ updateBar(val); }, 0);
}

不幸的是,我无法在单独的文件中使用 webworker。 谢谢...

不幸的是,无法强制 UI 进行渲染。不知道能不能打断wasm,但是这里有一个替代的想法。

考虑随着时间的推移分散计算,并给主线程(和事件循环)一些“喘息空间”来更新 UI。

假设您正在计算总和,总共需要花费很多时间。您可以拆分计算,以便一次计算一部分总和:

var sum = 0;
var i = setInterval(() => {
    sum = calculatePartialSum(sum);
    if(isDone(sum))
        clearInterval(i); // stop
},0);

超时设置为 0 的 setInterval 将 运行 内部代码尽可能频繁,但主线程(和 UI)可以在每次调用之间更新。

@schteppe:谢谢!对于谁有同样的问题。我用 emscripten_async_call().

解决了它

main.js

Module.cwrap('calc', 'undefined', [])();

calc.cpp

void calc() {
   EM_ASM({ progressBar([=11=]); }, value);
   emscripten_async_call("calcfunction, NULL, msec");
}
void calcfunction() {
   ...
   calc something
   ...
}