C ++中的睡眠函数


78

是否有类似的功能Sleep(time);使程序暂停X毫秒,但是在C ++中?

我应该添加哪个标头,函数的签名是什么?

Answers:


112

用途std::this_thread::sleep_for

std::chrono::milliseconds timespan(111605); // or whatever

std::this_thread::sleep_for(timespan);

还有补充std::this_thread::sleep_until


在C ++ 11之前,C ++没有线程概念,也没有睡眠功能,因此您的解决方案必然取决于平台。这是一个定义了sleepWindows或Unix函数:

#ifdef _WIN32
    #include <windows.h>

    void sleep(unsigned milliseconds)
    {
        Sleep(milliseconds);
    }
#else
    #include <unistd.h>

    void sleep(unsigned milliseconds)
    {
        usleep(milliseconds * 1000); // takes microseconds
    }
#endif

但是要使用一种更简单的C ++ 11之前的方法boost::this_thread::sleep


提示:this_thread :: sleep_for等正在使用单例,因此引入了STB_GNU_UNIQUE,如果在共享库中使用,则将阻止您的库卸载。
user1050755 '20

48

您至少需要C ++ 11。

#include <thread>
#include <chrono>

...

std::this_thread::sleep_for(std::chrono::milliseconds(200));

6
如果C ++委员会认为这是一种优雅,简洁的方式,那真的很奇怪……
shevy

@shevy如果要简洁,可以使用std::chrono_literals,将function参数减小为just 200ms
Ben Voigt

14

在Unix上,包括 #include <unistd.h>

您感兴趣的电话是usleep()。这需要微秒,因此您应该将毫秒值乘以1000,然后将结果传递给usleep()


9

对于Windows:

#include "windows.h" 
Sleep(10);

对于Unix:

#include <unistd.h>
usleep(10)

8

只是使用它...

首先包括unistd.h头文件,#include<unistd.h>并使用此功能将程序执行暂停所需的秒数:

sleep(x);

x 可以在几秒钟内取任何值。

如果要暂停程序5秒钟,则如下所示:

sleep(5);

是正确的,我经常使用。

对C和C ++有效。


2
@LFusleep需要微秒sleep(这个答案写在这方面),只需几秒钟-这样的答案是正确的,尽管不是便携式
人-编译

1
@ Human-Compiler对不起。评论前应仔细检查。
LF

8

在C ++ 11之前,还没有可移植的方法来执行此操作。

一种可移植的方法是使用Boost或Ace库。有ACE_OS::sleep();在ACE。


1
...并且(标准)之所以在标准中没有可移植的方法,是因为时钟的精度(最小时间单位)取决于硬件或取决于操作系统。不,我也不认为这是有说服力的原因,但是我们到了。
威廉港

没有诸如标准定义的线程之类的东西,而您想睡觉。睡眠是操作系统提供的功能。我可以拥有不提供此类功能的环境。
alexkr

@wilhelmtell:根本不是原因。除了您自己,是谁在做这种假设?没有标准的线程支持(yest),如果没有线程(或者只有一个线程),那么就不需要线程睡眠,而不是简单的“ busy-wait”,可以使用<time来实现.h> / <ctime>。该支持必须由线程库或操作系统提供。
克利福德,

1
您可以编辑答案,因为现在有一种可移植的方法可以执行此操作。
Abhinav Gauniyal

1
这是堆栈溢出,没有人会在过期时修改他们的答案。
SteamyThePunk

6

我为C ++ 11找到的最简单的方法是:

您的内容包括:

#include <chrono>
#include <thread>

您的代码(这是睡眠1000毫秒的示例):

std::chrono::duration<int, std::milli> timespan(1000);
std::this_thread::sleep_for(timespan);

持续时间可以配置为以下任意一种:

std::chrono::nanoseconds   duration</*signed integer type of at least 64 bits*/, std::nano>
std::chrono::microseconds  duration</*signed integer type of at least 55 bits*/, std::micro>
std::chrono::milliseconds  duration</*signed integer type of at least 45 bits*/, std::milli>
std::chrono::seconds       duration</*signed integer type of at least 35 bits*/, std::ratio<1>>  
std::chrono::minutes       duration</*signed integer type of at least 29 bits*/, std::ratio<60>>
std::chrono::hours         duration</*signed integer type of at least 23 bits*/, std::ratio<3600>>

0

最近,我正在学习chrono库,并想到了自己实现睡眠功能。这是代码,

#include <cmath>
#include <chrono>

template <typename rep = std::chrono::seconds::rep, 
          typename period = std::chrono::seconds::period>
void sleep(std::chrono::duration<rep, period> sec)
{
    using sleep_duration = std::chrono::duration<long double, std::nano>;

    std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
    std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

    long double elapsed_time = 
    std::chrono::duration_cast<sleep_duration>(end - start).count();

    long double sleep_time = 
    std::chrono::duration_cast<sleep_duration>(sec).count();

    while (std::isgreater(sleep_time, elapsed_time)) {
        end = std::chrono::steady_clock::now();
        elapsed_time = std::chrono::duration_cast<sleep_duration>(end - start).count(); 
    }
}

我们可以将其与任何std::chrono::duration类型一起使用(默认情况下,它std::chrono::seconds作为参数)。例如,

#include <cmath>
#include <chrono>

template <typename rep = std::chrono::seconds::rep, 
          typename period = std::chrono::seconds::period>
void sleep(std::chrono::duration<rep, period> sec)
{
    using sleep_duration = std::chrono::duration<long double, std::nano>;

    std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now();
    std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

    long double elapsed_time = 
    std::chrono::duration_cast<sleep_duration>(end - start).count();

    long double sleep_time = 
    std::chrono::duration_cast<sleep_duration>(sec).count();

    while (std::isgreater(sleep_time, elapsed_time)) {
        end = std::chrono::steady_clock::now();
        elapsed_time = std::chrono::duration_cast<sleep_duration>(end - start).count(); 
    }
}

using namespace std::chrono_literals;
int main (void) {
    std::chrono::steady_clock::time_point start1 = std::chrono::steady_clock::now();
    
    sleep(5s);  // sleep for 5 seconds
    
    std::chrono::steady_clock::time_point end1 = std::chrono::steady_clock::now();
    
    std::cout << std::setprecision(9) << std::fixed;
    std::cout << "Elapsed time was: " << std::chrono::duration_cast<std::chrono::seconds>(end1-start1).count() << "s\n";
    
    std::chrono::steady_clock::time_point start2 = std::chrono::steady_clock::now();

    sleep(500000ns);  // sleep for 500000 nano seconds/500 micro seconds
    // same as writing: sleep(500us)
    
    std::chrono::steady_clock::time_point end2 = std::chrono::steady_clock::now();
    
    std::cout << "Elapsed time was: " << std::chrono::duration_cast<std::chrono::microseconds>(end2-start2).count() << "us\n";
    return 0;
}

有关更多信息,请访问https://en.cppreference.com/w/cpp/header/chrono 并观看有关Howard Hinnant的cppcon演讲,https://www.youtube.com/watch?v= P32hvk8b13M 。他还有更多关于chrono库的讲座。而且您可以随时使用库函数std::this_thread::sleep_for

注意:输出可能不准确。因此,不要期望它给出确切的时间。

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.