C++中的Sleep函数

97

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

我应该添加哪个头文件,以及该函数的签名是什么?


这个回答解决了你的问题吗?毫秒级别的休眠 - Cris Luengo
10个回答

140

使用std::this_thread::sleep_for

#include <chrono>
#include <thread>

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

std::this_thread::sleep_for(timespan);

还有互补的std::this_thread::sleep_until


C++11之前,C++没有线程概念和睡眠功能,因此您的解决方案必然依赖于平台。下面是一个定义用于Windows或Unix的sleep函数的代码片段:

#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


1
提示:this_thread :: sleep_for等使用单例模式,因此会引入STB_GNU_UNIQUE,如果在共享库中使用,将阻止您的库能够卸载。 - user1050755

63

你至少需要 C++11。

#include <thread>
#include <chrono>

...

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

15
如果C++委员会认为这是一种优雅、简洁的方式,那么他们真的很奇怪。 - shevy
4
如果您想要简洁明了,可以使用std::chrono_literals来缩短函数参数为200ms - Ben Voigt
我将大部分内容放在标题下:#include <chrono> using std::chrono::milliseconds; #include <thread> using std::this_thread::sleep_for; 为了使内联代码更简洁: sleep_for(milliseconds(2000)); - chikega

21

对于Windows操作系统:

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

对于Unix系统:

#include <unistd.h>
usleep(10)

15
在Unix平台上,需要包含#include <unistd.h>
你需要使用的调用是usleep()。它使用微秒作为参数,因此你应该将你的毫秒值乘以1000,并将结果传递给usleep()函数。

11

只需使用它...

首先包含unistd.h头文件,#include<unistd.h>,然后使用此函数暂停程序执行所需的秒数:

sleep(x);

x可以取任何秒数的值。

如果您想让程序暂停5秒钟,可以这样写:

sleep(5);

这是正确的,我经常使用它。

对于C和C++是有效的。


2
@L.F. usleep 接受微秒为单位,而 sleep (此答案所述)接受秒为单位 -- 因此答案是正确的,尽管不可移植。 - Human-Compiler
1
@Human-Compiler 抱歉,评论前应该再检查一遍。 - L. F.

8
在C++11之前,没有一种可移植的方法来实现这个。
一种可移植的方法是使用Boost或Ace库。 在ACE中有ACE_OS::sleep();

1
...而且标准中没有可移植的方法来做到这一点的(假定)原因是因为时钟的精度(最小时间单位)取决于硬件或操作系统。不,我也不认为这是一个令人信服的理由,但我们就是这样。 - wilhelmtell
标准中没有定义线程这样的东西…如果你想让程序睡眠,那是由操作系统提供的功能。但我可能会遇到没有此类功能的环境。 - alexkr
@wilhelmtell:这根本不是原因。除了你自己,还有谁在做这个假设?目前还没有线程支持的标准,如果没有线程(或者只有一个线程),就不需要使用线程休眠,而可以使用<time.h>/<ctime>实现简单的“忙等待”。线程库或操作系统必须提供支持。 - Clifford
@alexkr - 两个C++标准后,这个回答似乎有点过时了。您可能需要修改一下吗? - Bo Persson
1
现在有一种便携式的方法可以做到这一点,您可以编辑您的答案。 - Abhinav Gauniyal
2
这是 Stack Overflow,没有人会在他们的答案过时后进行修订。 - 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>>

1

如果需要一个简短的解决方案,请使用以下方法:

#include <thread>

using namespace std;
using namespace std::this_thread;

void f() {
    sleep_for(200ms);
}

0

我喜欢@Ben Voigt提出的解决方案——它不依赖于C++之外的任何东西,但他没有提到使代码工作的重要细节。因此,我将放置完整的代码,请注意以using开头的行。

#include <thread>
#include <chrono>

...

using namespace std::chrono_literals;
std::this_thread::sleep_for(200ms);

0
最近我在学习chrono库,并想着自己实现一个sleep函数。以下是代码:
#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

注意:输出可能不准确,所以不要期望它能给出精确的时间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接