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
...
}
我想在 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
...
}