boost::asio(1):封装了定时器类

用过MFC的童鞋都知道,SetTimer, KillTimer, OnTimer很好用。

但是boost::asio里面也有一个定时器类(boost::asio::deadline_timer)。

但是和MFC的定时器类有区别,MFC里面当你KillTimer后,OnTimer不被调用。但是boost::asio里面的超时处理函数会被立即调用。

因此我自己写一个一个类,具有SetTimer, KillTimer, OnTimer,并且KillTimer后,OnTimer不被调用。

请看:

#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>

class CAsyncTimer
{
protected:
    bool SetTimer(int iTimerID, int iElapse, void* pChild) {
        MapTimer::iterator it = m_mapTimer.find(iTimerID);
        if( it != m_mapTimer.end() ) {
            return false;
        }
        
        PTIMER_INFO pInfo = new TIMER_INFO;
        pInfo->iTimerID = iTimerID;
        pInfo->iElapse = iElapse;
        pInfo->pChild = pChild;
        pInfo->timer = boost::shared_ptr< boost::asio::deadline_timer >(new boost::asio::deadline_timer(*m_sp_ios));

        pInfo->timer->expires_from_now(boost::posix_time::millisec(iElapse));
        pInfo->timer->async_wait(boost::bind(&CAsyncTimer::OnTimerInternal, this, iTimerID, boost::asio::placeholders::error));

        m_mapTimer.insert(std::pair<int, PTIMER_INFO>(iTimerID, pInfo));

        return true;
    }
    
    bool KillTimer(int iTimerID) {
        MapTimer::iterator it = m_mapTimer.find(iTimerID);
        if( it == m_mapTimer.end() ) {
            return false;
        }

        PTIMER_INFO pInfo = (PTIMER_INFO)(it->second);
        pInfo->timer->cancel();
        m_mapTimer.erase(it);

        return true;
    }
    
    virtual void OnTimer(int iTimerID, const boost::system::error_code& error) {
        MapTimer::iterator it = m_mapTimer.find(iTimerID);
        if( it == m_mapTimer.end() ) {
            return;
        }

        PTIMER_INFO pInfo = (PTIMER_INFO)(it->second);
        
        pInfo->timer->expires_from_now(boost::posix_time::millisec(pInfo->iElapse));
        pInfo->timer->async_wait(boost::bind(&CAsyncTimer::OnTimerInternal, this, iTimerID, boost::asio::placeholders::error));
    }

private:
    void OnTimerInternal(int iTimerID, const boost::system::error_code& error) {
        MapTimer::iterator it = m_mapTimer.find(iTimerID);
        if( it == m_mapTimer.end() ) {
            return;
        }
        
        PTIMER_INFO pInfo = (PTIMER_INFO)(it->second);
        
        ((CAsyncTimer*)(pInfo->pChild))->OnTimer(iTimerID, error);

        CAsyncTimer::OnTimer(iTimerID, error);
    }
    
protected:
    typedef struct tagTIMER_INFO {
        int iTimerID;
        int iElapse;
        void *pChild;
        boost::shared_ptr< boost::asio::deadline_timer > timer;
    } TIMER_INFO, *PTIMER_INFO;
    typedef std::map<int, PTIMER_INFO> MapTimer;

    CAsyncTimer(boost::asio::io_service& ios) 
        : m_sp_ios(&ios) {
        
    }
    ~CAsyncTimer() {
        MapTimer::iterator it = m_mapTimer.begin();
        for( ; it != m_mapTimer.end(); it ++) {
            PTIMER_INFO pInfo = (PTIMER_INFO)(it->second);
            delete pInfo;
            pInfo = NULL;
        }
        m_mapTimer.clear();
    }
    
    MapTimer        m_mapTimer;
    boost::shared_ptr< boost::asio::io_service >     m_sp_ios;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值