在C++中是否有类似于Sleep(time);
的函数暂停程序X毫秒的功能?
我应该添加哪个头文件,以及该函数的签名是什么?
在C++中是否有类似于Sleep(time);
的函数暂停程序X毫秒的功能?
我应该添加哪个头文件,以及该函数的签名是什么?
使用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
。
你至少需要 C++11。
#include <thread>
#include <chrono>
...
std::this_thread::sleep_for(std::chrono::milliseconds(200));
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对于Windows操作系统:
#include "windows.h"
Sleep(10);
对于Unix系统:
#include <unistd.h>
usleep(10)
#include <unistd.h>
。usleep()
。它使用微秒作为参数,因此你应该将你的毫秒值乘以1000,并将结果传递给usleep()
函数。只需使用它...
首先包含unistd.h
头文件,#include<unistd.h>
,然后使用此函数暂停程序执行所需的秒数:
sleep(x);
x
可以取任何秒数的值。
如果您想让程序暂停5秒钟,可以这样写:
sleep(5);
这是正确的,我经常使用它。
对于C和C++是有效的。
usleep
接受微秒为单位,而 sleep
(此答案所述)接受秒为单位 -- 因此答案是正确的,尽管不可移植。 - Human-Compiler我发现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>>
如果需要一个简短的解决方案,请使用以下方法:
#include <thread>
using namespace std;
using namespace std::this_thread;
void f() {
sleep_for(200ms);
}
我喜欢@Ben Voigt提出的解决方案——它不依赖于C++之外的任何东西,但他没有提到使代码工作的重要细节。因此,我将放置完整的代码,请注意以using开头的行。
#include <thread>
#include <chrono>
...
using namespace std::chrono_literals;
std::this_thread::sleep_for(200ms);
#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
。
注意:输出可能不准确,所以不要期望它能给出精确的时间。