如何为 C++ 程序添加定时延迟?

Posted

技术标签:

【中文标题】如何为 C++ 程序添加定时延迟?【英文标题】:How do you add a timed delay to a C++ program? 【发布时间】:2010-09-14 14:06:31 【问题描述】:

我正在尝试在 C++ 程序中添加定时延迟,并且想知道是否有人对我可以尝试的内容或可以查看的信息有任何建议?

我希望我有更多关于如何实现此定时延迟的详细信息,但在我获得有关如何添加定时延迟的更多信息之前,我不确定我应该如何尝试实现它。

【问题讨论】:

这取决于您使用的平台 (OS) 和可用的库。 【参考方案1】:

C++11 的更新答案:

使用sleep_forsleep_until 函数:

#include <chrono>
#include <thread>

int main() 
    using namespace std::this_thread; // sleep_for, sleep_until
    using namespace std::chrono; // nanoseconds, system_clock, seconds

    sleep_for(nanoseconds(10));
    sleep_until(system_clock::now() + seconds(1));

使用这些函数,不再需要不断添加新函数以获得更好的分辨率:sleepusleepnanosleep 等。sleep_forsleep_until 是模板函数,可以接受任何值通过chrono 类型解析;小时、秒、飞秒等。

在 C++14 中,您可以使用 nanosecondsseconds 的文字后缀进一步简化代码:

#include <chrono>
#include <thread>

int main() 
    using namespace std::this_thread;     // sleep_for, sleep_until
    using namespace std::chrono_literals; // ns, us, ms, s, h, etc.
    using std::chrono::system_clock;

    sleep_for(10ns);
    sleep_until(system_clock::now() + 1s);

请注意,休眠的实际持续时间取决于实现:您可以要求休眠 10 纳秒,但实现可能最终会休眠一毫秒,如果这是它可以做的最短时间。

【讨论】:

用户定义的文字后缀。他们挖……太深了。【参考方案2】:

In Win32:

#include<windows.h>
Sleep(milliseconds);

In Unix:

#include<unistd.h>
unsigned int microsecond = 1000000;
usleep(3 * microsecond);//sleeps for 3 second

sleep() 只需要几秒钟,这通常太长了。

【讨论】:

还有 nanosleep() 如果 usleep() 不能给你足够的分辨率。 请记住,这些函数的参数是 MINIMUM 睡眠时间,并且不保证如果此时另一个进程占用 CPU,您会立即回来。 @Richard Harrison:我必须包含哪个标题才能让 sleep() 工作? @Overflowh on win32 Sleep() 在 windows.h 中;在 unistd.h 中的 unix sleep() 上 @TommasoTheaCioni 好的,我假设你的意思是,“我怎样才能让程序在延迟时准确地重新启动?”,答案是......你可以'吨。您无法控制操作系统到那种程度。如果其他程序处于某个关键段的中间,您的程序只需要等待。【参考方案3】:
#include <unistd.h>
usleep(3000000);

这也会休眠三秒钟。不过,您可以进一步细化这些数字。

【讨论】:

谢谢!简单而干净的解决方案。在 Mac 上使用 G++ VS Code 进行编译。【参考方案4】:

你想要一些简单的东西吗:

#include <unistd.h>
sleep(3);//sleeps for 3 second

【讨论】:

应该的。它几乎是普遍的。您尝试使用哪种语言/编译器?您是否导入了所有必要的库? 我不明白为什么它没有被标记为答案或没有太多支持【参考方案5】:

请注意,这并不能保证线程休眠的时间量会接近休眠期,它只保证线程继续执行之前的时间量至少是所需的量。实际延迟将根据情况(尤其是相关机器上的负载)而有所不同,并且可能比所需的睡眠时间高几个数量级。

此外,您没有列出为什么需要睡眠,但通常应避免使用延迟作为同步方法。

【讨论】:

【参考方案6】:

你可以试试这段代码sn-p:

#include<chrono>
#include<thread>

int main()
    std::this_thread::sleep_for(std::chrono::nanoseconds(10));
    std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::seconds(1));

【讨论】:

【参考方案7】:

我发现如果包含 chrono 库,"_sleep(milliseconds);"(不带引号)适用于 Win32

例如:

#include <chrono>

using namespace std;

main

    cout << "text" << endl;
    _sleep(10000); // pauses for 10 seconds

确保在睡眠前包含下划线。

【讨论】:

此功能已被更新的库或操作系统功能取代。考虑改用睡眠。【参考方案8】:

如果您想要微秒级精度,也可以使用 select(2)(这适用于没有 usleep(3) 的平台)

以下代码将等待 1.5 秒:

#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>`

int main() 
    struct timeval t;
    t.tv_sec = 1;
    t.tv_usec = 500000;
    select(0, NULL, NULL, NULL, &t);

`

【讨论】:

【参考方案9】:

是的,睡眠可能是这里选择的功能。请注意,传递给函数的时间是调用线程处于非活动状态的最短时间。因此,例如,如果您在 5 秒内调用 sleep,则可以保证您的线程将至少休眠 5 秒。可能是 6、8 或 50,具体取决于操作系统在做什么。 (在最佳操作系统执行期间,这将非常接近 5。) sleep 函数的另一个有用功能是传入 0。这将强制从您的线程切换上下文。

一些附加信息:http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html

【讨论】:

【参考方案10】:

要在 cpp 中延迟输出固定时间,您可以通过包含 windows.h 头文件来使用 Sleep() 函数 Sleep() 函数的语法是 Sleep(time_in_ms) 作为

cout<<"Apple\n";
Sleep(3000);
cout<<"Mango";

输出。上面的代码会打印 Apple 并等待 3 秒再打印 Mango。

【讨论】:

【参考方案11】:

这里的最佳答案似乎是依赖于操作系统的答案;对于更便携的解决方案,您可以使用 ctime 头文件编写一个快速睡眠功能(尽管这对我来说可能是一个糟糕的实现)。

#include <iostream>
#include <ctime>

using namespace std;

void sleep(float seconds)
    clock_t startClock = clock();
    float secondsAhead = seconds * CLOCKS_PER_SEC;
    // do nothing until the elapsed time has passed.
    while(clock() < startClock+secondsAhead);
    return;

int main()

    cout << "Next string coming up in one second!" << endl;
    sleep(1.0);
    cout << "Hey, what did I miss?" << endl;

    return 0;

【讨论】:

【参考方案12】:

语法:

无效睡眠(无符号秒数);

sleep() 暂停执行一段时间(秒)。 调用 sleep 后,当前程序将暂停执行由参数 seconds 指定的秒数。间隔仅精确到最接近的百分之一秒或操作系统时钟的精确度,以较不精确的为准。

【讨论】:

【参考方案13】:

许多其他人提供了很好的睡眠信息。我同意 Wedge 的观点,睡眠很少是最合适的解决方案。

如果您在等待某事时正在睡觉,那么您最好实际等待该事物/事件。查看条件变量。

我不知道您要在什么操作系统上执行此操作,但对于线程和同步,您可以查看 Boost Threading 库 (Boost Condition Varriable)。

如果您试图等待非常短的时间,那么现在转向另一个极端,那么有几个 hack 样式选项。如果您在某种没有实现“睡眠”的嵌入式平台上工作,那么您可以尝试一个带有空主体的简单循环(for/while 等)(注意编译器不会优化它)。当然,在这种情况下,等待时间取决于具体的硬件。 对于非常短的“等待”,您可以尝试组装“nop”。我非常怀疑这些是你所追求的,但不知道你为什么需要等待很难更具体。

【讨论】:

【参考方案14】:

在 Windows 上,您可以包含 windows 库并使用“Sleep(0);”让程序休眠。它需要一个表示毫秒的值。

【讨论】:

以上是关于如何为 C++ 程序添加定时延迟?的主要内容,如果未能解决你的问题,请参考以下文章

定时任务 @scheduled

如何为 Rails 控制器添加延迟以进行测试?

c++实现定时回调函数

在SysTick微秒及毫秒程序举例中,定时器一次最大定时时间是多少毫秒?

Vertx 定时器更改延迟

如何为循环添加延迟?