【发布时间】: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