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


93

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

我希望我有更多有关如何实现此定时延迟的详细信息,但是在获得有关如何添加定时延迟的更多信息之前,我不确定甚至应如何尝试执行此操作。


2
这取决于您使用的平台(OS)和可用的库。
Scott Langham

Answers:


80

Win32:Sleep(milliseconds)你是什​​么

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

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


3
如果usleep()不能为您提供足够的分辨率,则还可以使用nanosleep()。
克里斯托弗·约翰逊

9
请记住,这些函数的参数是“最小睡眠时间”,并且如果当时有另一个进程占用CPU,则不保证您会立即回来。
billjamesdev

1
@Richard Harrison:我必须包括哪个标头才能使sleep()工作?
溢出

12
win32 Sleep()上的@Overflowh在windows.h中;在unistd.h上的unix sleep()上
理查德·哈里森

1
@TommasoTheaCioni好吧,我想你的意思是,“我如何才能让程序完全在延迟时重新启动?”,答案是……你不能。您不能将操作系统控制到那种程度。如果某个其他程序位于某个关键段的中间,则您的程序只需等待。
Billjamesdev

136

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类型; 小时,秒,飞秒等

在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纳秒,但是如果实现时间最短,则实现可能最终会睡眠一毫秒。


4
用户定义的文字后缀。他们挖了……太深了。
西罗Santilli郝海东冠状病六四事件法轮功


17

您想要简单的东西吗

sleep(3);

这应该。它几乎是普遍的。您尝试使用哪种语言/编译器?您是否导入了所有必需的库?
JJ

3
我不明白为什么它没有标记为答案或没有太大upvoted
ImranNaqvi

8

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

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


4

您可以尝试以下代码片段:

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

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

`


3

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

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


3

我发现,"_sleep(milliseconds);"如果包含chrono库,则(不带引号)对于Win32效果很好

例如:

#include <chrono>

using namespace std;

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

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


此功能已被较新的库或操作系统功能所取代。考虑改用睡眠。
ByWaleed

3

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

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

输出。以上代码将打印Apple并等待3秒钟,然后再打印Mango。


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

0

句法:

无效睡眠(无符号秒);

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


0

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

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

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

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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.