写入stdout的文本在程序完成之前不会出现

时间:2015-09-14 20:23:45

标签: c emscripten

在这个例子中,我只是简单地打印从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在浏览器中运行时才会出现此问题。

2 个答案:

答案 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