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

时间:2008-10-01 16:46:37

标签: c++ time

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

我希望我能详细了解如何实现这个定时延迟,但在获得有关如何添加定时延迟的更多信息之前,我不确定如何尝试实现此功能。

14 个答案:

答案 0 :(得分:95)

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_for和{{1}是模板函数,可以通过sleep_until类型接受任何分辨率的值;小时,秒,飞秒等。

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

seconds

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

答案 1 :(得分:60)

Win32:Sleep(milliseconds)就是你的意思

unix:usleep(microseconds)就是你想要的。

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

答案 2 :(得分:27)

#include <unistd.h>
usleep(3000000);

这也会睡三秒钟。你可以稍微改进一下数字。

答案 3 :(得分:8)

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

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

答案 4 :(得分:7)

你想要像

那样简单的东西吗?
sleep(3);

答案 5 :(得分:3)

如果你想要微秒精度,你也可以使用select(2)(这适用于没有睡眠的平台(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);
}

`

答案 6 :(得分:3)

如果您包含"_sleep(milliseconds);"

,我发现chrono(不带引号)适用于Win32

E.g:

#include <chrono>

using namespace std;

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

确保在睡觉前加入下划线。

答案 7 :(得分:2)

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

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

答案 8 :(得分:2)

这里的最高答案似乎是与操作系统有关的答案;对于更便携式的解决方案,您可以使用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;
}

答案 9 :(得分:1)

您可以尝试以下代码段:

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

答案 10 :(得分:1)

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

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

OUTPUT。上面的代码将打印Apple并等待3秒后再打印芒果。

答案 11 :(得分:0)

语法:

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

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

答案 12 :(得分:0)

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

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

我不知道您尝试使用哪种操作系统,但是对于线程和同步,您可以查看Boost Threading库(Boost Condition Varriable)。

如果你想等待特别短的时间,现在转到另一个极端,那么有几种黑客风格的选择。如果你正在开发某种没有实现'sleep'的嵌入式平台,那么你可以尝试一个简单的循环(for / while等)和一个空体(小心编译器不会优化它)。当然,等待时间取决于这种情况下的特定硬件。 对于非常短暂的'等待',您可以尝试装配“nop”。我非常怀疑这些是你所追求的,但不知道为什么你需要等待它很难更具体。

答案 13 :(得分:0)

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