您好,欢迎来到刀刀网。
搜索
您的当前位置:首页C++ | 延时函数

C++ | 延时函数

来源:刀刀网

C++ | 延时函数

函数 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);
 }

时间单位转换

Reference


>>>>> 欢迎关注公众号【三戒纪元】 <<<<<

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务