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

来源:互联网 发布:qq飞车淘宝刷魅力方法 编辑:程序博客网 时间:2024/05/01 12:45

用过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;};


0 0