写入标准输出的文本直到程序完成才出现
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
在这个例子中,我只是打印从 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