菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
160
0

定时器

原创
05/13 14:22
阅读数 85274
定时器,这个是项目中很多地方用的,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;
}
之前说搞个定时器很费效率,我看没什么,主要是驱动是在哪里

 

发表评论

0/200
160 点赞
0 评论
收藏