【问题标题】:How do I delay a function in C? [duplicate]如何延迟 C 中的函数? [复制]
【发布时间】:2017-04-29 14:13:13
【问题描述】:

我找不到可行的指南,所以我想问如何在 C 语言中延迟一个函数,换句话说,如何让程序在继续执行其他函数之前等待一定的秒数?

例如:

printf("First Function.\n");

//program waits a certain number of seconds before executing next command

printf("Second function executed after certain amount of seconds");

我想知道,我使用什么命令来实现这一点?

delay();

顺便说一句,对我来说是行不通的。

我必须补充一下,sleep() 也不起作用。

【问题讨论】:

  • 你想要sleep()
  • sleep 在 Unix 上,Sleep 在 Windows 上。
  • 我建议你谷歌这个问题的标题。
  • 标准 C 中没有这样的功能。解决方案特定于操作系统(或操作系统系列)。比如unix下sleep(),windows下Sleep()。您需要阅读目标系统和相关 API 的文档。
  • "sleep() 也不起作用。" 在哪种意义上不起作用?请更具体!您在哪个平台上遇到这些问题?

标签: c


【解决方案1】:

sleep 就是您要找的。​​p>

printf("First Function.\n");

sleep(20);  // Replace 20 with the "certain amount"

printf("Second function executed after certain amount of seconds")

【讨论】:

【解决方案2】:

您可以使用 Sleep() 或选择添加延迟。

【讨论】:

  • 我很好奇为什么sleep() 不是线程安全的。
  • 我编辑了我的答案,我不知道为什么,但我只是习惯于调用 select 来延迟线程,sleep 的文档清楚地表明只调用线程睡眠
  • 也许你在想pselect(),它与线程安全无关,但异步信号安全。
【解决方案3】:

sleep() 函数是 POSIX。如果需要更高的精度,还有 POSIX 函数 nanosleep()

C11 中有 thrd_sleep() 函数(来自 threads.h),但 AFAIK 这个函数仍然不受 glibc 支持。

一个简单的睡眠功能可以使用time.h中的函数实现可移植:

#include <stdio.h>
#include <time.h>

void my_sleep(unsigned);
void delay_print(char *);

int main(void)
{
    delay_print("What is taking so long?");
    delay_print("Glad that's over!");
}

void my_sleep(unsigned duration)
{
    time_t start = time(NULL);
    double end = duration;
    time_t now;
    do {
        now = time(NULL);
    } while (difftime(now, start) < end);
}

void delay_print(char *msg)
{
    my_sleep(5);
    puts(msg);
}

【讨论】:

  • 由于“轮询”,这会占用所有可用的 CPU 周期,因此可能不是最好的方法。
  • @user3629249-- 我确实写了“简单的睡眠功能”,我认为我的回答中暗示这可以在任何适当的库的缺席中使用职能。我认为大多数操作系统会检测负载并进行调整。我不确定是否有一种可移植的方式来做到这一点并避免 CPU 开销,但我很乐意看到替代方案 :)
【解决方案4】:

您可以轻松使用:

sleep(unsigned int seconds);   //   from the unistid.h
Sleep(int milliseconds);       //   from the Windows.h

【讨论】:

  • POSIX 的sleep() 采用unsigned int
猜你喜欢
  • 2019-03-05
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多