如何在我的 for 循环中正确实现睡眠功能? (Ubuntu)

Posted

技术标签:

【中文标题】如何在我的 for 循环中正确实现睡眠功能? (Ubuntu)【英文标题】:How do I implement the sleep function in my for loop correctly? (Ubuntu) 【发布时间】:2019-09-07 00:03:10 【问题描述】:

我试图让我的代码在屏幕上打印一些东西,然后等待 1 秒钟,然后绕过 for 循环并再次打印 21 次。当我在 Windows 中的 CodeBlocks 中使用#include 然后使用 Sleep(1000) 时,它可以工作。但是当我使用#include 和 sleep(1) 在我的 Ubuntu VM 上执行此操作时,所有内容都会从我的终端消失 21 秒,然后立即全部出现。我认为我使用了错误的功能或其他东西。

有什么想法吗?

这是 Ubuntu 终端中的代码,它最终会删除我终端上已经存在的所有内容,等待 21 秒,然后只打印“Hello”21 次。

#include <stdio.h>
#include <unistd.h>

int main()


    for (int i = 0; i < 21; i++)
    
        printf("Hello");
        sleep(1);           
    


这是 Windows 中的代码,它每秒打印“Hello”,持续 21 秒,因此在 21 秒内在我的屏幕上打印 21 个 Hello。这就是我想要在我的 Ubuntu VM 中实现的目标。

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>

    int main() 
        for (int i = 0; i < 21; i++)
        
            printf("Hello");
            Sleep(1000);
        

        return 0; 
    

【问题讨论】:

printf 替换为puts 投票结束:OP 承认他们提供的 MCVE 与他们正在解决的实际问题不同,提出新问题。引用 OP:I tried adding the fflush(stdout); like you suggested, but it doesn't work for my code - probably because I'm using mvprintw (from ncurses) instead of printf 【参考方案1】:

在 UNIX 中,进程流缓冲 - 默认情况下,它们会累积 I/O,并且不会在写入时立即“刷新”到底层设备。所以 - 你需要刷新流:

#include <stdio.h>
#include <unistd.h>

int main()


    for (int i = 0; i < 21; i++)
    
        printf("Hello");
        fflush(stdout);
        sleep(1);           
    


我相信,如果你在“Hello”之后输出一个换行符'\n',它也会起作用。

【讨论】:

【参考方案2】:

printf 输出被缓冲 - 这意味着它不能保证立即出现在屏幕上。相反,它会在以下情况之一发生时出现:

当缓冲区变满时,-此时缓冲区的旧内容会显示在屏幕上,并且缓冲区会为新的输出重新清除-这称为缓冲区刷新 当应用程序终止时 - 这会强制刷新所有 printf 缓冲区,这就是您在屏幕上看到的内容 当缓冲区被程序员刷新时。

最后一种情况对您来说最有趣,有两种方法可以做到这一点 - 在您的字符串中包含 \n(换行符)控制字符,例如

 printf("Hello\n");

或调用fflush 获取标准输出流,例如

 printf("Hello");
 fflush(stdout);

【讨论】:

有没有办法使用另一个函数来实现同样的事情?我尝试按照您的建议添加fflush(stdout);,但它不适用于我的代码 - 可能是因为我使用的是mvprintw(来自ncurses)而不是printf。我以为我可以应用相同的解决方案,但显然不行。有什么东西可以代替睡眠吗? @Sawy3r 如果您的 MCVE 实际上是 MCVE,它将对您和回答您问题的人有很大帮助。您现在有两个答案,它们对它的面值提出了问题。我建议您使用正确的 MCVE 提出一个不同的问题。

以上是关于如何在我的 for 循环中正确实现睡眠功能? (Ubuntu)的主要内容,如果未能解决你的问题,请参考以下文章

ios - 如何在 ios swift 中正确实现后台获取

如何在 Swift 中正确实现不同视图控制器之间的协议和委托?

如何在 Node.js 中正确实现“忘记/重置密码”功能? (使用一次性令牌)

如何在 maven pom.xml 中正确定义插件版本?

如何在python的类中正确实现辅助函数

如何在php中正确实现结构化菜单