是否有类似Sleep(time);
的函数暂停程序X毫秒,但是在C ++中?
我应该添加哪个标题以及函数的签名是什么?
答案 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 Hinnant,https://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);