C++ 中的睡眠函数
Posted
技术标签:
【中文标题】C++ 中的睡眠函数【英文标题】:Sleep function in C++ 【发布时间】:2010-12-12 02:49:36 【问题描述】:是否有类似Sleep(time);
的函数可以将程序暂停 X 毫秒,但在 C++ 中?
我应该添加哪个标头以及函数的签名是什么?
【问题讨论】:
这能回答你的问题吗? Sleep for milliseconds 【参考方案1】:对于 Windows:
#include "windows.h"
Sleep(10);
对于 Unix:
#include <unistd.h>
usleep(10)
【讨论】:
【参考方案2】:在 C++11 之前,没有可移植的方式来做到这一点。
一种可移植的方式是使用 Boost 或 Ace 库。
ACE 中有ACE_OS::sleep();
。
【讨论】:
... 并且(假定)在标准中没有可移植的方法的原因是因为时钟的精度(最小时间单位)取决于硬件或操作系统。不,我也不认为这是一个令人信服的理由,但我们就是这样。 标准中没有定义线程这样的东西......你想要睡觉。睡眠是操作系统提供的功能。我可以拥有不提供此类功能的环境。 @wilhelmtell:这根本不是原因。除了你自己,还有谁在做这个假设?没有线程支持的标准(是的),如果没有线程(或者只有一个线程),则不需要线程睡眠而不是简单的“忙等待”,可以用 你可以编辑你的答案,因为现在有一种便携的方法可以做到这一点。 这是堆栈溢出,没有人会修改他们的答案,因为他们已经过时了。【参考方案3】:在 Unix 上,包括 #include <unistd.h>
。
您感兴趣的电话是usleep()
。这需要微秒,因此您应该将毫秒值乘以 1000 并将结果传递给 usleep()
。
【讨论】:
【参考方案4】:使用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
函数的 sn-p:
#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
但是一个更简单的 pre-C++11 方法是使用boost::this_thread::sleep
。
【讨论】:
提示:this_thread::sleep_for 等正在使用单例,因此引入了 STB_GNU_UNIQUE,如果在共享库中使用它会阻止您的库卸载。【参考方案5】:我为 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>>
【讨论】:
【参考方案6】:至少需要 C++11。
#include <thread>
#include <chrono>
...
std::this_thread::sleep_for(std::chrono::milliseconds(200));
【讨论】:
如果 C++ 委员会认为这是一种优雅、简洁的方式,他们真的很奇怪...... @shevy 如果你想更简洁,你可以使用std::chrono_literals
,将函数参数减少为200ms
。【参考方案7】:
随便用吧……
首先包含unistd.h
头文件#include<unistd.h>
,然后使用此函数将程序执行暂停所需的秒数:
sleep(x);
x
可以取任何以秒为单位的值。
如果你想暂停程序 5 秒是这样的:
sleep(5);
是正确的,我经常使用它。
适用于 C 和 C++。
【讨论】:
@L.F.usleep
需要几微秒,sleep
(这个答案是用 来写的)需要几秒钟——所以答案是正确的,尽管不便携
@Human-Compiler 抱歉。在评论之前应该仔细检查。【参考方案8】:
最近我在学习 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
注意:输出可能不准确。所以,不要指望它给出确切的时间。
【讨论】:
【参考方案9】:我喜欢@Ben Voigt 提出的解决方案——它不依赖于 C++ 之外的任何东西,但他没有提到使代码工作的重要细节。所以我放了完整的代码,请注意以 using 开头的行。
#include <thread>
#include <chrono>
...
using namespace std::chrono_literals;
std::this_thread::sleep_for(200ms);
【讨论】:
【参考方案10】:对于一个简短的解决方案使用
#include <thread>
using namespace std;
using namespace std::this_thread;
void f()
sleep_for(200ms);
【讨论】:
以上是关于C++ 中的睡眠函数的主要内容,如果未能解决你的问题,请参考以下文章
C++睡眠延时函数 Sleep() usleep()(windows.hunistd.h)