boost::asio:封装定时器类

#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;
};

转载于:https://www.cnblogs.com/ydsz/p/9677936.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值