zoukankan      html  css  js  c++  java
  • 定时器

    定时器,这个是项目中很多地方用的,AI,所有的技能定时都是用的这个,很久就像看他了,但没有看,今天看了下
    现在明白只要是经理写的东西都很饶人
    这个定时器也是通过计算时间定时的调用,用的是boost里面的QueryPerformanceCounter跟cpu中定时器有关系估计这个精度是相当的高了,获取系统的时时时间这个是需要硬件支持的
    比GetTickCount精度要高,这个函数有18ms的问题,应该系统18ms发送一次,不是时时的。
    
    都说这个是工厂模式,但我看这个不是啥工厂模式,只是感觉像工厂模式
    //TimerFactory里面保存了这个结构体
    struct mark_t
    {
        int            Id;
        bool        State;            //是否开始
        int            Interval;        //时间间隔
        std::function<void()>        Event;//绑定的函数
        std::shared_ptr<timer_ex>    Timer;//高精度定时器
    };
    
    int main(int argc, char* argv[])
    {
        
        I_TimerFactory* tf = NEW(TimerFactory);
        /*
        Timer_imp里面有一个TimerFactory指针,然后直接操作这个TimerFactory指针,经理写的东西都很饶人
        */
        //每一个Timer_imp里面都有一个时间工厂的指针,将这个指针设置成tf
        auto myTimer1 = tf->createTimer();
        auto myTimer2 = tf->createTimer();
        auto myTimer_chen = tf->createTimer();
        
        //向时间工厂变量mark中添加变量包括id,状态,事件,时间等,还是针对这个tf做一些事情
        myTimer1->regTimer(boost::bind(onTimer1));
        //设定mark相应变量的时间
        myTimer1->setInterval(10000);
        //设定mark相应变量的状态
        myTimer1->start();
    
        myTimer2->regTimer(boost::bind(onTimer2));
        myTimer2->setInterval(20000);
        myTimer2->start();
    
        myTimer_chen->regTimer(boost::bind(onTimer_chen));
        myTimer_chen->setInterval(30000);
        myTimer_chen->start();
            
        for (int i=0;i<100;++i)
        {
            tf->driveTimer();//这个经常放到一个线程里面进行调用
    
            boost::this_thread::interruptible_wait(1000);
        }
        
        std::cout << "myTimer2 stop!" << std::endl;
        std::cout << "***************" << std::endl;
        //getchar();
        myTimer2->stop();
            
        for (int i=0;i<100;++i)
        {
            tf->driveTimer();//可以移动到其他线程进行驱动,但不安全,但项目里面都是在其他线程驱动,我想定时器在驱动之前是不会再创建的,里面主要是有个公共的变量_mask
            boost::this_thread::interruptible_wait(100);
        }
        // 析构会反注册,说的这么玄乎,其实就是从那个mask里面erase掉
        myTimer2 = tf->createTimer();
        myTimer2->regTimer(boost::bind(onTimer2));
        myTimer2->setInterval(2000);
        myTimer2->start();
        getchar();
        std::cout << std::endl << "123456897*" << std::endl;
    }
    之前说搞个定时器很费效率,我看没什么,主要是驱动是在哪里
  • 相关阅读:
    字集码(字符编码)
    图片轮播(可实现手动与自动的切换)
    Eclipse常用快捷键
    Java并发编程:Callable、Future和FutureTask
    Java并发之CountDownLatch、CyclicBarrier和Semaphore
    java注解
    JVM加载class原理
    阿里中间件技术及双十一实践--软负载——分布式系统的引路人
    阿里中间件技术及双十一实践--中间件总体介绍
    Java的LockSupport.park()实现分析
  • 原文地址:https://www.cnblogs.com/zzyoucan/p/4021329.html
Copyright © 2011-2022 走看看