写入标准输出的文本直到程序完成才出现

text written to stdout doesn't appear until program completion

在这个例子中,我只是打印从 0 到 9 的数字,每个数字都有延迟。然而,不是将数字滴到输出 window,而是长时间停顿("spinner" 图标搅动)然后所有数字立即显示(在 Chromium 44.0 和 Firefox 中测试40.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 运行 时才会出现此问题。

来自 emscripten source we find that fflush 什么都不做。

也许这种行为是设计使然,因此需要将主循环替换为 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