【问题标题】:text written to stdout doesn't appear until program completion写入标准输出的文本在程序完成之前不会出现
【发布时间】:2015-12-10 22:56:22
【问题描述】:

在这个例子中,我只是打印了从 0 到 9 的数字,每个数字都有延迟。但是,不是将数字滴到输出窗口,而是长时间停顿(“微调器”图标搅动),然后立即显示所有数字(在 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 在浏览器中运行时才会出现问题。

【问题讨论】:

  • 你用普通的 C 编译器试过没有任何外来的东西吗?
  • 如果fflush 被简单地映射到无操作,我不会感到惊讶。不过,这只是一个疯狂的猜测。
  • @EugeneSh.:我以前没有费心这样做,因为我知道这应该可行。但既然你问了,我就做了——而且它按预期工作(每个数字后都有明显的延迟)。
  • Here 你去吧,我猜..
  • 也许可以通过提供Module object 的自定义实现来解决。

标签: c emscripten


【解决方案1】:

从emscripten source 我们发现fflush 什么都不做。

【讨论】:

  • +1 表示好数据。但是,链接页面中似乎存在一些歧义,即在字符串包含 \n 的情况下,无操作 fflush() 是否相关(就像我的一样)。换句话说,stdout 可能/应该是“行缓冲”,如here 所述,因此无论fflush() 如何,每一行都应立即出现。我真的只添加了fflush() 以防止评论者提出建议。
【解决方案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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 2011-07-02
相关资源
最近更新 更多