码迷,mamicode.com
首页 > 其他好文 > 详细

定时器

时间:2014-10-13 03:14:58      阅读:272      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   for   sp   div   

定时器,这个是项目中很多地方用的,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;
}
之前说搞个定时器很费效率,我看没什么,主要是驱动是在哪里

 

定时器

标签:style   blog   color   io   os   ar   for   sp   div   

原文地址:http://www.cnblogs.com/zzyoucan/p/4021329.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!