C 睡眠方法阻碍输出到控制台
C sleep method obstructs output to console
我有一个 C 程序,我只是想测试我是否可以在安装模块时重现 npm install
中使用的控制台微调器。这个特殊的旋转器只是按以下顺序旋转:
|
/
-
\
在同一个space上,所以我使用了下面的程序:
#include <stdio.h>
int main() {
char sequence[4] = "|/-\";
while(1) {
for(int i = 0; i < 4; i++) {
// \b is to make the character print to the same space
printf("\b%c", sequence[i]);
// now I want to delay here ~0.25s
}
}
}
所以我找到了一种方法让它从 <time.h> documentation 开始休息那么久,并制作了这个程序:
#include <stdio.h>
#include <time.h>
void sleep(double seconds) {
clock_t then;
then = clock();
while(((double)(clock() - then) / CLOCKS_PER_SEC) < seconds); //do nothing
}
int main() {
char sequence[4] = "|/-\";
while(1) {
for(int i = 0; i < 4; i++) {
printf("\b%c", sequence[i]);
sleep(0.25);
}
}
}
但是现在没有任何内容打印到控制台。有谁知道我怎样才能产生我想要的行为?
编辑 根据流行的观点,我将上面的代码更新为以下内容:
#include <stdio.h>
#include <unistd.h>
int main() {
char sequence[4] = "|/-\";
while(1) {
for(int i = 0; i < 4; i++) {
printf("\b%c", sequence[i]);
/* fflush(stdout); */
// commented out to show same behavior as program above
usleep(250000); // 250000 microseconds = 0.25 seconds
}
}
}
写入控制台后需要刷新。否则,程序将缓冲您的输出:
fflush(stdout);
事情确实被打印到控制台,只是没有被刷新。添加 fflush(stdout)
以查看结果,或通过调用 setbuf
:
将控制台设置为无缓冲模式
setbuf(stdout, NULL);
您的代码的一个更大问题是您的 sleep
方法运行一个繁忙的循环,无缘无故地消耗 CPU 个循环。更好的替代方法是调用 usleep
,它需要微秒数:
usleep(25000);
睡眠功能不是你的问题。问题是输出被缓冲了。最简单的事情就是研究 ncurses。
现在:
fflush(stdout);
我有一个 C 程序,我只是想测试我是否可以在安装模块时重现 npm install
中使用的控制台微调器。这个特殊的旋转器只是按以下顺序旋转:
|
/
-
\
在同一个space上,所以我使用了下面的程序:
#include <stdio.h>
int main() {
char sequence[4] = "|/-\";
while(1) {
for(int i = 0; i < 4; i++) {
// \b is to make the character print to the same space
printf("\b%c", sequence[i]);
// now I want to delay here ~0.25s
}
}
}
所以我找到了一种方法让它从 <time.h> documentation 开始休息那么久,并制作了这个程序:
#include <stdio.h>
#include <time.h>
void sleep(double seconds) {
clock_t then;
then = clock();
while(((double)(clock() - then) / CLOCKS_PER_SEC) < seconds); //do nothing
}
int main() {
char sequence[4] = "|/-\";
while(1) {
for(int i = 0; i < 4; i++) {
printf("\b%c", sequence[i]);
sleep(0.25);
}
}
}
但是现在没有任何内容打印到控制台。有谁知道我怎样才能产生我想要的行为?
编辑 根据流行的观点,我将上面的代码更新为以下内容:
#include <stdio.h>
#include <unistd.h>
int main() {
char sequence[4] = "|/-\";
while(1) {
for(int i = 0; i < 4; i++) {
printf("\b%c", sequence[i]);
/* fflush(stdout); */
// commented out to show same behavior as program above
usleep(250000); // 250000 microseconds = 0.25 seconds
}
}
}
写入控制台后需要刷新。否则,程序将缓冲您的输出:
fflush(stdout);
事情确实被打印到控制台,只是没有被刷新。添加 fflush(stdout)
以查看结果,或通过调用 setbuf
:
setbuf(stdout, NULL);
您的代码的一个更大问题是您的 sleep
方法运行一个繁忙的循环,无缘无故地消耗 CPU 个循环。更好的替代方法是调用 usleep
,它需要微秒数:
usleep(25000);
睡眠功能不是你的问题。问题是输出被缓冲了。最简单的事情就是研究 ncurses。
现在:
fflush(stdout);