115

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

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

4

14 回答 14

171

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));
}

有了这些函数,就不再需要不断地添加新函数以获得更好的分辨率:sleepusleepnanosleepsleep_for,并且sleep_until是可以通过chrono类型接受任何分辨率值的模板函数;小时、秒、飞秒等

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

#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 纳秒,但实施可能最终会睡眠一毫秒,如果这是它可以做的最短时间。

于 2012-03-17T05:57:58.580 回答
108

在 Win32 中

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

在 Unix 中

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

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

于 2008-10-01T16:52:13.623 回答
38
#include <unistd.h>
usleep(3000000);

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

于 2008-10-01T16:50:32.800 回答
26

你想要像这样简单的东西:

#include <unistd.h>
sleep(3);//sleeps for 3 second
于 2008-10-01T16:47:31.653 回答
8

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

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

于 2008-10-01T16:55:19.983 回答
6

你可以试试这个代码片段:

#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));
}
于 2014-09-12T12:25:50.247 回答
4

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

例如:

#include <chrono>

using namespace std;

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

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

于 2014-09-12T12:07:09.143 回答
3

如果您想要微秒精度,也可以使用 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);
}

`

于 2008-10-01T16:49:17.110 回答
3

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

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

于 2008-10-01T17:01:41.463 回答
3

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

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

输出。上面的代码将打印 Apple 并在打印 Mango 之前等待 3 秒。

于 2017-04-18T17:09:05.437 回答
3

这里的最佳答案似乎是依赖于操作系统的答案;对于更便携的解决方案,您可以使用 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;
}
于 2020-01-15T23:11:13.160 回答
0

句法:

无效睡眠(无符号秒);

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

于 2008-10-01T16:48:49.280 回答
0

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

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

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

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

于 2008-10-02T04:43:53.397 回答
0

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

于 2008-10-02T04:52:21.787 回答