C++ | 延时函数
文章目录
- C++ | 延时函数
- 函数 sleep/usleep
- 头文件
- boost sleep
- 自定义函数
- 时间单位转换
- Reference
- >>>>> 欢迎关注公众号【三戒纪元】 <<<<<
函数 sleep/usleep
unsigned sleep(unsigned seconds); // 单位是秒 s
sleep(33); // 延时33秒
void usleep(int micro_seconds); // 单位是毫秒 ms
usleep(23); // 延时23毫秒
void sleep_for(const chrono::duration<_Rep, _Period>& __rtime)
std::this_thread::sleep_for(std::chrono::microseconds(msec_to_delay_randy_));
usleep和sleep都是系统调用,usleep更加精确,不能实现实时延迟(系统调用消耗时间)
头文件
// VC中
#include <windows.h>
// 在gcc编译器中,使用的头文件因gcc版本的不同而不同
#include <unistd.h>
usleep 源码:
/* Posix declares this handy function obsolete, but I don't think it is in
any danger of going away. It sleeps for the given number of microseconds.
However, using SimTK::sleepInNs() or SimTK::sleepInSec() is safer. */
typedef unsigned int useconds_t;
inline int usleep(useconds_t us) {
struct timespec req;
// 求商
req.tv_sec = (long) (us / 1000000U);
// 求尾数,转换为整数
req.tv_nsec = (long)((us % 1000000U)*1000U);
int status = nanosleep(&req,0);
return status ? -1 : 0;
}
sleep_for 源码:
void
__sleep_for(chrono::seconds, chrono::nanoseconds);
/// sleep_for
template<typename _Rep, typename _Period>
inline void
sleep_for(const chrono::duration<_Rep, _Period>& __rtime)
{
if (__rtime <= __rtime.zero())
return;
auto __s = chrono::duration_cast<chrono::seconds>(__rtime);
auto __ns = chrono::duration_cast<chrono::nanoseconds>(__rtime - __s);
#ifdef _GLIBCXX_USE_NANOSLEEP
__gthread_time_t __ts =
{
static_cast<std::time_t>(__s.count()),
static_cast<long>(__ns.count())
};
while (::nanosleep(&__ts, &__ts) == -1 && errno == EINTR)
{ }
#else
__sleep_for(__s, __ns);
#endif
}
boost sleep
如果代码中引用了boost,可以直接调用sleep函数
#include <boost/thread.hpp>
#if defined BOOST_THREAD_USES_DATETIME
inline BOOST_SYMBOL_VISIBLE void sleep(::boost::xtime const& abs_time)
{
sleep(system_time(abs_time));
}
#endif
static inline void sleep(const system_time& xt)
{
this_thread::sleep(xt);
}
自定义函数
#include <time.h> /* 调用时务必加上该头文件 */
// 自定义的一个延时函数delay()
void delay(int seconds) // 参数必须为整型,表示延时多少秒
{
clock_t start = clock();
clock_t lay = (clock_t)seconds * CLOCKS_PER_SEC;
while ((clock()-start) < lay);
}
void delay(double seconds) // 参数为双精度浮点型。这个函数是我修改的上面那个函数,重载一下。
{
double start = clock();
double lay = (double)seconds * CLOCKS_PER_SEC;
while ((clock()-start) < lay);
}
时间单位转换
1秒(s) = 1000 毫秒(ms) = 1,000,000 微秒(μs) = 1,000,000,000 纳秒(ns) = 1,000,000,000,000 皮秒(ps)
1s = 1000ms
1ms = 1000μs
1μs = 1000ns
1ns = 1000ps
Reference
- 【c++】6.延时函数
- Linux的sleep()和usleep()的使用和区别