是否有类似的功能Sleep(time);使程序暂停X毫秒,但是在C ++中?
我应该添加哪个标头,函数的签名是什么?
Answers:
用途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。
在C ++ 11之前,还没有可移植的方法来执行此操作。
一种可移植的方法是使用Boost或Ace库。有ACE_OS::sleep();在ACE。
我为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>>
最近,我正在学习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
注意:输出可能不准确。因此,不要期望它给出确切的时间。