/** @file MessageBuffer.h @brief 消息缓存对了类,实现消息缓冲,提供读写接口,消息读写加锁 @author 周正龙 */ #pragma once #include "boost/thread.hpp" #include "FesMessage.pb.h" #include "OptDataMessage.pb.h" #include #define MAX_CHG_ANA_QUEUE_NUM 50 //变化数据最大队列数,如果超出,丢弃最老数据(50*1000 一秒变化数据5万,windwo 处理5秒左右,linux2秒左右) #define MAX_CHG_DIG_QUEUE_NUM 100 //变化数据最大队列数,最多保证不丢失 15万YX点,10%变化率,30秒持续,不丢失事件(1.5*10000*30 万点的容量) #define MAX_MAN_SET_QUEUE_NUM 500 //人工置数最大队列数(考虑对一个间隔,最多200个测点) #define MAX_CAL_SET_QUEUE_NUM 200 //计算公式最大队列数(考虑公式不会超时1000,变化率20%) #define MAX_UPD_QUEUE_NUM 20 //全数据最大队列数,如果超出,丢弃最老数据 (每种类型25*10000 20万点的容量) #define MAX_EVT_QUEUE_NUM 500000//变化事件,如果超出,丢弃最老数据(考虑15万YX点,10%变化率,30秒持续,共45万点不丢失事件) namespace kbd_service { class CPacketQueue { public: CPacketQueue(); virtual ~CPacketQueue(); private://变化数据 boost::mutex m_objMutexChgAi; //锁 boost::mutex m_objMutexChgDi; //锁 boost::mutex m_objMutexChgMi; //锁 boost::mutex m_objMutexChgPi; //锁 std::deque m_deqFesChgAiPkg; std::deque m_deqFesChgDiPkg; std::deque m_deqFesChgMiPkg; std::deque m_deqFesChgPiPkg; private://全数据;保存最新全数据 boost::mutex m_objMutexUpdAi; //锁 boost::mutex m_objMutexUpdDi; //锁 boost::mutex m_objMutexUpdMi; //锁 boost::mutex m_objMutexUpdPi; //锁 std::deque m_deqFesUpdAiPkg; std::deque m_deqFesUpdDiPkg; std::deque m_deqFesUpdMiPkg; std::deque m_deqFesUpdPiPkg; private://操作+事件 boost::mutex m_objMutexCalSet; //锁 boost::mutex m_objMutexManSet; //锁 boost::mutex m_objMutexSoeEvt; //锁 std::deque m_deqFesSoeEventPkg; std::map> m_mapOptCalSetPkg; //计算设置 std::map> m_mapOptManSetPkg; //人工设置 public: /** @brief 从消息接受队列得到一条消息记录 */ void addFesChangeAnaPkg(const kbd_idlfile::SFesChangeAiPkg &objFesChgAiPkg); void addFesChangeDigPkg(const kbd_idlfile::SFesChangeDiPkg &objFesChgDiPkg); void addFesChangeMixPkg(const kbd_idlfile::SFesChangeMiPkg &objFesChgMiPkg); void addFesChangeAccPkg(const kbd_idlfile::SFesChangePiPkg &objFesChgPiPkg); void addFesUpdateAnaPkg(const kbd_idlfile::SFesUpdateAiPkg &objFesUpdAiPkg); void addFesUpdateDigPkg(const kbd_idlfile::SFesUpdateDiPkg &objFesUpdDiPkg); void addFesUpdateMixPkg(const kbd_idlfile::SFesUpdateMiPkg &objFesUpdMiPkg); void addFesUpdateAccPkg(const kbd_idlfile::SFesUpdatePiPkg &objFesUpdPiPkg); /** @brief 从消息接受队列得到一条消息记录 */ bool getFesChangeAnaPkg(std::deque &queFesChgAiPkg); bool getFesChangeDigPkg(std::deque &queFesChgDiPkg); bool getFesChangeMixPkg(std::deque &queFesChgMiPkg); bool getFesChangeAccPkg(std::deque &queFesChgPiPkg); bool getFesUpdateAnaPkg(kbd_idlfile::SFesUpdateAiPkg &objFesUpdAiPkg); bool getFesUpdateDigPkg(kbd_idlfile::SFesUpdateDiPkg &objFesUpdDiPkg); bool getFesUpdateMixPkg(kbd_idlfile::SFesUpdateMiPkg &objFesUpdMiPkg); bool getFesUpdateAccPkg(kbd_idlfile::SFesUpdatePiPkg &objFesUpdPiPkg); /** @brief 从消息接受队列得到一条消息记录 */ void addOptCalSetPkg(const kbd_idlfile::SOptSetDataPkg &objOptCalSetPkg); //计算设置 void addOptManSetPkg(const kbd_idlfile::SOptSetDataPkg &objOptManSetPkg); //人工设置 bool getOptCalSetPkg(const int nPointType,std::deque &queOptCalSetPkg); //计算设置 bool getOptManSetPkg(const int nPointType,std::deque &queOptManSetPkg); //人工设置 /** @brief 从消息接受队列得到一条消息记录 */ void addFesSoeEventPkg(const kbd_idlfile::SFesSoeEventPkg &objFesSoeEventPkg); bool getFesSoeEventPkg(std::deque &queFesSoeEventPkg); }; typedef boost::shared_ptr CPacketQueuePtr; }