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
- boost::asio(1):封装了定时器类
- 【boost】boost::asio(1)--timer定时器
- boost::asio 定时器
- boost asio定时器学习
- Boost asio--tcp server---1(无封装阻塞)
- boost-ASIO--(1)
- 【boost学习】之boost::asio(1)——Timer定时器
- boost asio 定时器 deadline_timer cancel
- boost asio学习(1)
- boost::asio名字空间中的deadline_time类:定时器
- boost-asio学习1——定时器(同步、异步)
- 使用boost ASIO库封装TCP服务器类
- C++ boost::asio::serial_port 串口通信类 使用 封装
- boost完全开发指南第12章-并发编程 1 (采用boost-asio库封装的tcp_server)
- boost库之asio库, 定时器
- boost中的asio实现定时器功能
- Boost Asio 1.56 学习之同步定时器
- Boost中ASIO的一些用法-定时器
- ios7 自定义UINavigationBar UIBarButtonItem 10px的偏移纠正的两种解决方案
- jdbc应用程序连接Oracle rac的URL写法:
- 优化大型复杂SQL
- android 滑动事件冲突解决 Touch事件处理机制
- Scrollview 裁剪问题解决
- boost::asio(1):封装了定时器类
- 如何对镶嵌数据集进行色彩平衡
- 判断shell字符串是否为空
- foj 2173 floyd+矩阵快速幂
- java中File的delete()方法删除文件失败的原因
- poj 2774 Long Long Message
- 设计一个javascript框架
- XML document structures must start and end within the same entity.
- VC实现类似qq聊天粘贴发送文件