在 emscripten 网页汇编正在运行期间更新进度条?

Update progress bar during emscripten webassembly is running?

本文关键字:更新 运行期 emscripten 网页 汇编      更新时间:2023-10-16

我想在emscripten网页程序集运行时显示进度条。但是进度条在网络组装完成后更新。有没有办法中断 webassembly (主线程(,然后继续或强制 javascript(主线程(渲染 GUI?

主.js

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

计算.cpp

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

我也试过了

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

不幸的是,对我来说,不可能在单独的文件中使用 Web Worker 。 谢谢。。。

遗憾的是,无法强制呈现 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(( 解决了它。

主.js

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

计算.cpp

void calc() {
EM_ASM({ progressBar($0); }, value);
emscripten_async_call("calcfunction, NULL, msec");
}
void calcfunction() {
...
calc something
...
}