C ++中的睡眠功能

时间:2009-11-01 21:25:10

标签: c++

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

我应该添加哪个标题以及函数的签名是什么?

9 个答案:

答案 0 :(得分:83)

使用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 ++没有线程概念且没有睡眠功能,因此您的解决方案必然依赖于平台。这是一个为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 :(得分:23)

你至少需要C ++ 11。

{{1}}

答案 2 :(得分:9)

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

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

答案 3 :(得分:5)

没有便携的方法可以做到这一点。

便携式方法是使用Boost或Ace库。 有ACE_OS :: sleep();在ACE。

答案 4 :(得分:3)

对于Windows:

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

对于Unix:

#include <unistd.h>
usleep(10)

答案 5 :(得分:1)

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

您的包含:

#include <windows.h>
#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::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>> 

答案 6 :(得分:0)

只需使用它......

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

sleep(x);

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

如果你想暂停程序5秒钟,就像这样:

sleep(5);

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

对C和C ++有效。

答案 7 :(得分: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 Hinnanthttps://www.youtube.com/watch?v=P32hvk8b13M的cppcon讨论。 他还有更多关于chrono库的演讲。而且,您随时可以使用库函数std::this_thread::sleep_for

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

答案 8 :(得分:0)

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

#include <thread>
#include <chrono>

...

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