在这个例子中,我只是简单地打印从0到9的数字,每次都有延迟。但是,不是将数字滴到输出窗口,而是有一个很长的停顿(使用"微调器"图标搅拌),然后所有数字一次显示(在Chromium 44.0和Firefox 40.0中测试) 0.3)。
有没有办法立即向stdout
显示?
#include <stdio.h>
void time_waster( int reps=100 ) {
static volatile unsigned counter=0;
for ( int a=0; a<reps; a++ ) {
for ( int b=0; b<1000*1000; b++ ) counter++;
}
}
int main() {
for ( int i=0; i<10; i++ ) {
fprintf(stdout,"%d\n",i);
fflush(stdout);
time_waster();
}
}
用以下内容构建的JavaScript和HTML:
emcc -Wall -Werror -o temp.html count.c
顺便说一下,这个小例子生成的HTML + JavaScript的总大小大约是600KB(14619行),因此在浏览器中调试将是一项非常重要的任务。
注意:我在C ++中遇到std::cout
同样的问题(也有显式刷新),但决定用C语言编写问题作为问题的简化。
如果我使用node.js运行程序,我发现输出会按预期显示:
node temp.js
因此,只有在使用Emscripten编译器生成的HTML在浏览器中运行时才会出现此问题。
答案 0 :(得分:3)
从emscripten source我们发现fflush
什么也没做。
答案 1 :(得分:2)
也许这种行为是设计的,因此主循环需要被emscripten_set_main_loop
或Emterpreter-Async取代。
https://github.com/kripken/emscripten/wiki/Emterpreter
#include <stdio.h>
#include <emscripten/emscripten.h>
void time_waster( int reps=100 ) {
static volatile unsigned counter=0;
for ( int a=0; a<reps; a++ ) {
for ( int b=0; b<1000*1000; b++ ) counter++;
}
}
int main() {
for ( int i=0; i<10; i++ ) {
fprintf(stdout,"%d\n",i);
fflush(stdout);
emscripten_sleep(0);
time_waster();
}
}
em++ -Wall -Werror -o temp.html count.cpp -s EMTERPRETIFY=1 -s EMTERPRETIFY_ASYNC=1 -s EMTERPRETIFY_WHITELIST="['_main']" -Oz