消息机4_B
/********************************************************************
author : Clark/陈泽丹
created : 2013-9-10
purpose : 计数释放
*********************************************************************/ #pragma once
class AutoRelease
{
public:
AutoRelease(void){ m_count = 0; }
virtual ~AutoRelease(void){}
AutoRelease* GetPointClone()
{
++m_count;
return this;
}
void Release()
{
m_count = m_count - 1;
if( m_count <= 0)
delete this;
} private:
long m_count;
};
/********************************************************************
author : Clark/陈泽丹
created : 2013-9-10
purpose : 消息处理器
*********************************************************************/ #pragma once
#include <string>
#include <map> using namespace std; typedef map< string, void* > LST_EVT_TYPE; class IMsgListener
{
public:
virtual ~IMsgListener(){};
virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt ) = 0;
};
/********************************************************************
author : Clark/陈泽丹
created : 2013-9-10
purpose : 消息关联项
*********************************************************************/ #pragma once
#include "IMsgListener.h" class IMsgServerItem
{
public:
virtual ~IMsgServerItem(){}
virtual bool AddListener( string _msg, IMsgListener* _p_lst ) = 0;
virtual void RemoveListener( string _msg, IMsgListener* _p_lst ) = 0;
virtual void UpdataListener() = 0;
virtual bool DispatchEvt( string _msg, LST_EVT_TYPE* _evt ) = 0;
};
/********************************************************************
author : Clark/陈泽丹
created : 2013-9-10
purpose : 消息处理器
*********************************************************************/ #pragma once
#include "AutoRelease.h"
#include "IMsgListener.h"
#include "MsgServer4.h"
#include <iostream> using namespace std; class VoteTest:public IMsgListener
{
public:
virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt )
{
cout<<"VoteTest"<<endl;
return false;
}
}; class InitTest:public IMsgListener
{
public:
virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt )
{
cout<<"InitTest"<<endl;
return true;
}
}; class ActTest:public IMsgListener
{
public:
virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt )
{
cout<<"ActTest"<<endl;
return true;
}
}; class UninitTest:public IMsgListener
{
public:
virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt )
{
cout<<"UninitTest"<<endl;
return true;
}
}; class EvtHelper: public AutoRelease
{
public:
virtual bool Init() = 0;
virtual void UnInit() = 0;
}; template< class _LST_TYPE >
class ComEvtHelper: public EvtHelper
{
public:
ComEvtHelper( MsgServer4* _msg_svr, string _msg, int _lst_type, _LST_TYPE& _p_evt_hd, LST_EVT_TYPE* _p_evt_cdt = 0 ):m_evt_handle(_p_evt_hd, _p_evt_cdt)
{
m_msg_svr = _msg_svr;
m_type = _lst_type;
m_msg = _msg;
}
~ComEvtHelper(){}
bool Init(){ return m_msg_svr->AddListener( m_msg, m_type, &m_evt_handle ); }
void UnInit(){ m_msg_svr->RemoveListener( m_msg, m_type, &m_evt_handle ); } private:
class ComEvtHandle: public IMsgListener
{
public:
ComEvtHandle( _LST_TYPE& _p_evt_hd, LST_EVT_TYPE* _p_evt_cdt )
{
mp_evt_hd = _p_evt_hd;
_p_evt_hd = 0;
if( 0 != _p_evt_cdt )
mp_evt_cdt = *_p_evt_cdt;
}
virtual ~ComEvtHandle()
{
delete mp_evt_hd;
mp_evt_hd = 0;
}
virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt )
{
LST_EVT_TYPE::iterator it = mp_evt_cdt.begin();
while( mp_evt_cdt.end() != it )
{
LST_EVT_TYPE::iterator tmp = _evt->find( it->first );
if( _evt->end() == tmp || tmp->second != it->second )
return false;
it++;
}
return mp_evt_hd->OnEvt(_msg, _evt);
}
private:
_LST_TYPE mp_evt_hd;
LST_EVT_TYPE mp_evt_cdt;
};
ComEvtHandle m_evt_handle;
MsgServer4* m_msg_svr;
int m_type;
string m_msg;
}; typedef bool (*ON_EVT_TYPE)(string, LST_EVT_TYPE*);
template<>
class ComEvtHelper< ON_EVT_TYPE >: public EvtHelper
{
public:
ComEvtHelper( MsgServer4* _msg_svr, string _msg, int _lst_type, ON_EVT_TYPE& _evt_hd, LST_EVT_TYPE* _p_evt_cdt = 0 ):m_evt_handle(_evt_hd, _p_evt_cdt)
{
m_msg_svr = _msg_svr;
m_type = _lst_type;
m_msg = _msg;
}
~ComEvtHelper(){}
bool Init(){ return m_msg_svr->AddListener( m_msg, m_type, &m_evt_handle ); }
void UnInit(){ m_msg_svr->RemoveListener( m_msg, m_type, &m_evt_handle ); } private:
class ComEvtHandle: public IMsgListener
{
public:
ComEvtHandle( ON_EVT_TYPE& _evt_hd, LST_EVT_TYPE* _p_evt_cdt )
{
mp_evt_hd = _evt_hd;
if( 0 != _p_evt_cdt )
mp_evt_cdt = *_p_evt_cdt;
}
virtual bool OnEvt( string _msg, LST_EVT_TYPE* _evt )
{
LST_EVT_TYPE::iterator it = mp_evt_cdt.begin();
while( mp_evt_cdt.end() != it )
{
LST_EVT_TYPE::iterator tmp = _evt->find( it->first );
if( _evt->end() == tmp || tmp->second != it->second )
return false;
it++;
}
return mp_evt_hd(_msg, _evt);
}
private:
ON_EVT_TYPE mp_evt_hd;
LST_EVT_TYPE mp_evt_cdt;
};
ComEvtHandle m_evt_handle;
MsgServer4* m_msg_svr;
int m_type;
string m_msg;
}; template< class _LST_TYPE >
EvtHelper* CreateComEvtHelper( MsgServer4* _msg_svr, string _msg, int _lst_type, _LST_TYPE _p_evt_hd, LST_EVT_TYPE* _p_evt_cdt = 0 )
{
return new ComEvtHelper<_LST_TYPE>( _msg_svr, _msg, _lst_type, _p_evt_hd, _p_evt_cdt );
}
/********************************************************************
author : Clark/陈泽丹
created : 2013-9-10
purpose : 消息关联中心
*********************************************************************/ #pragma once
#include "IMsgListener.h"
#include "IMsgServerItem.h"
#include "MsgSvrItem.h"
#include <vector>
#include <string> using namespace std; class MsgServer4
{
public:
MsgServer4(void);
virtual ~MsgServer4(void); void PushSvr( int _sign, IMsgServerItem* _msg_svr );
void Clear();
bool AddListener( string _msg, int _lst_type, IMsgListener* _p_lst );
void RemoveListener( string _msg, int _lst_type, IMsgListener* _p_lst );
void DispatchEvt( string _msg, LST_EVT_TYPE* _evt ); private:
typedef pair<int, IMsgServerItem*> SVR_TYPE;
vector<SVR_TYPE> mvct_msg_svr;
}; class MsgServer4Helper
{
public:
enum MSG_SVR_TYPE
{
VOTE = 1,
INIT = 2,
ACTION = 3,
UNINIT = 4,
};
void Init();
void UnInit();
MsgServer4* GetSvr();
LST_EVT_TYPE* GetPar(); private:
MsgServer4 g_msg_svr4;
LST_EVT_TYPE g_evt;
IMsgServerItem* p_vote_svr;
IMsgServerItem* p_init_svr;
IMsgServerItem* p_action_svr;
IMsgServerItem* p_uninit_svr;
};
#include "MsgServer4.h" MsgServer4::MsgServer4()
{
} MsgServer4::~MsgServer4(void)
{
Clear();
} void MsgServer4::PushSvr( int _sign, IMsgServerItem* _msg_svr )
{
SVR_TYPE tmp = make_pair(_sign, _msg_svr);
mvct_msg_svr.push_back(tmp);
_msg_svr = 0;
} void MsgServer4::Clear()
{
mvct_msg_svr.clear();
} bool MsgServer4::AddListener( string _msg, int _lst_type, IMsgListener* _p_lst )
{
if( _lst_type >= 0 && _lst_type <= mvct_msg_svr.size() )
{
long len = mvct_msg_svr.size();
for( int i=0; i<len; i++ )
{
if( mvct_msg_svr[i].first == _lst_type )
{
return mvct_msg_svr[i].second->AddListener(_msg, _p_lst);
}
}
}
return false;
} void MsgServer4::RemoveListener( string _msg, int _lst_type, IMsgListener* _p_lst )
{
if( _lst_type >= 0 && _lst_type <= mvct_msg_svr.size() )
{
long len = mvct_msg_svr.size();
for( int i=0; i<len; i++ )
{
if( mvct_msg_svr[i].first == _lst_type )
{
mvct_msg_svr[i].second->RemoveListener(_msg, _p_lst);
return;
}
}
}
} void MsgServer4::DispatchEvt( string _msg, LST_EVT_TYPE* _evt )
{
int len = mvct_msg_svr.size();
for( int i=0; i<len; i++)
{
if( true == mvct_msg_svr[i].second->DispatchEvt(_msg,_evt) )
return;
}
} void MsgServer4Helper::Init()
{
p_vote_svr = new VoteMsgSvrItem();
p_init_svr = new ActionMsgSvrItem();
p_action_svr = new ActionMsgSvrItem();
p_uninit_svr = new ActionMsgSvrItem();
g_msg_svr4.PushSvr( MSG_SVR_TYPE::VOTE, p_vote_svr );
g_msg_svr4.PushSvr( MSG_SVR_TYPE::INIT, p_init_svr );
g_msg_svr4.PushSvr( MSG_SVR_TYPE::ACTION, p_action_svr );
g_msg_svr4.PushSvr( MSG_SVR_TYPE::UNINIT, p_uninit_svr );
} void MsgServer4Helper::UnInit()
{
g_msg_svr4.Clear();
delete p_vote_svr;
delete p_init_svr;
delete p_action_svr;
delete p_uninit_svr;
} MsgServer4* MsgServer4Helper::GetSvr()
{
return &g_msg_svr4;
} LST_EVT_TYPE* MsgServer4Helper::GetPar()
{
return &g_evt;
}
/********************************************************************
author : Clark/陈泽丹
created : 2013-9-10
purpose : 消息关联项实例
*********************************************************************/ #pragma once
#include "IMsgServerItem.h"
#include <vector>
#include <map>
#include <string> using namespace std; class BaseMsgSvrItem: public IMsgServerItem
{
public:
BaseMsgSvrItem();
virtual ~BaseMsgSvrItem(); virtual bool AddListener( string _msg, IMsgListener* _p_lst );
virtual void RemoveListener( string _msg, IMsgListener* _p_lst );
virtual void UpdataListener();
virtual bool DispatchEvt( string _msg, LST_EVT_TYPE* _evt ) = 0; protected:
typedef vector< IMsgListener* > LIST_TYPE;
typedef map< string, LIST_TYPE* > LST_MAP_TYPE;
typedef pair< string, IMsgListener* > REMOVE_TYPE;
LST_MAP_TYPE m_map_lst; private:
vector< REMOVE_TYPE > m_vct_remove;
}; class VoteMsgSvrItem: public BaseMsgSvrItem
{
public:
virtual bool DispatchEvt( string _msg, LST_EVT_TYPE* _evt );
}; class ActionMsgSvrItem: public BaseMsgSvrItem
{
public:
virtual bool DispatchEvt( string _msg, LST_EVT_TYPE* _evt );
};
#include "MsgSvrItem.h" BaseMsgSvrItem::BaseMsgSvrItem()
{
} BaseMsgSvrItem::~BaseMsgSvrItem()
{
LST_MAP_TYPE::iterator it = m_map_lst.begin();
while( it != m_map_lst.end() )
{
LIST_TYPE* p_items = it->second;
it->second = 0;
it++;
delete p_items;
}
m_map_lst.clear();
m_vct_remove.clear();
} bool BaseMsgSvrItem::AddListener( string _msg, IMsgListener* _p_lst )
{
LST_MAP_TYPE::iterator it = m_map_lst.find(_msg);
if( m_map_lst.end() == it )
{
m_map_lst[_msg] = new vector<IMsgListener*>();
m_map_lst[_msg]->push_back(_p_lst);
return true;
}
else
{
LIST_TYPE items = *(it->second);
long len = items.size();
for( long i=0; i<len; i++ )
{
if( items[i] == _p_lst )
return false;
}
items.push_back(_p_lst);
return true;
}
} void BaseMsgSvrItem::RemoveListener( string _msg, IMsgListener* _p_lst )
{
m_vct_remove.push_back( make_pair(_msg, _p_lst) );
} void BaseMsgSvrItem::UpdataListener()
{
long len = m_vct_remove.size();
for( int i=0; i<len; i++ )
{
REMOVE_TYPE tmp = m_vct_remove[i];
LST_MAP_TYPE::iterator it = m_map_lst.find( tmp.first );
if( m_map_lst.end() != it )
{
LIST_TYPE* p_items = (it->second);
long len = p_items->size();
for( long i=0; i<len; i++ )
{
if( (*p_items)[i] == tmp.second )
{
for( long j=i+1; i<len-1; i++ )
{
(*p_items)[j-1] = (*p_items)[j];
}
p_items->pop_back();
}
}
}
}
} bool VoteMsgSvrItem::DispatchEvt( string _msg, LST_EVT_TYPE* _evt )
{
UpdataListener();
bool ret = false;
LST_MAP_TYPE::iterator it = m_map_lst.find( _msg );
if( m_map_lst.end() != it )
{
LIST_TYPE* p_items = (it->second);
long len = p_items->size();
for( long i=0; i<len; i++ )
{
if( true == (*p_items)[i]->OnEvt(_msg, _evt) )
{
ret = true;
break;
}
}
}
UpdataListener();
return ret;
} bool ActionMsgSvrItem::DispatchEvt( string _msg, LST_EVT_TYPE* _evt )
{
UpdataListener();
LST_MAP_TYPE::iterator it = m_map_lst.find( _msg );
if( m_map_lst.end() != it )
{
LIST_TYPE* p_items = (it->second);
long len = p_items->size();
for( long i=0; i<len; i++ )
{
(*p_items)[i]->OnEvt(_msg, _evt);
}
}
UpdataListener();
return false;
}
#include <iostream>
#include "MsgListener.h"
#include "MsgSvrItem.h"
#include "MsgServer4.h" using namespace std; bool OnEvtTest( string _msg, LST_EVT_TYPE* _evt )
{
cout<<"OnEvtTest"<<endl;
return false;
} void main()
{
MsgServer4Helper g_msg_svr4;
g_msg_svr4.Init(); LST_EVT_TYPE condition;
condition["1"] = (void*)1;
EvtHelper* p_vote = CreateComEvtHelper( g_msg_svr4.GetSvr(), "123", MsgServer4Helper::VOTE, new VoteTest(),&condition);
EvtHelper* p_init = CreateComEvtHelper( g_msg_svr4.GetSvr(), "123", MsgServer4Helper::INIT, OnEvtTest, &condition );
EvtHelper* p_act = CreateComEvtHelper( g_msg_svr4.GetSvr(), "123", MsgServer4Helper::ACTION, OnEvtTest, &condition );
EvtHelper* p_uninit = CreateComEvtHelper( g_msg_svr4.GetSvr(), "123", MsgServer4Helper::UNINIT, OnEvtTest, &condition ); p_vote->Init();
p_init->Init();
p_act->Init();
p_uninit->Init();
LST_EVT_TYPE* par = g_msg_svr4.GetPar();
(*par)["1"] = (void*)1;
(*par)["2"] = (void*)2;
(*par)["3"] = (void*)3;
g_msg_svr4.GetSvr()->DispatchEvt("123", g_msg_svr4.GetPar());
p_uninit->UnInit();
p_act->UnInit();
g_msg_svr4.GetSvr()->DispatchEvt("123", g_msg_svr4.GetPar());
p_init->UnInit();
p_vote->UnInit(); system("pause");
g_msg_svr4.UnInit();
p_vote->Release();
p_init->Release();
p_act->Release();
p_uninit->Release(); }
消息机4_B的更多相关文章
- chrome插件开发-消息机制中的bug与解决方案
序言 最近开发chrome插件,涉及到消息传递机时按照教程去敲代码,结果总是不对.研究了大半天终于找到原因,现在记录下. 程序 插件程序参考官网 chrome官网之消息传递机制, 不能FQ的同事也可以 ...
- ThreadLocal ——android消息机制handler在非主线程创建not called Looper.prepare() 错误的原因
引用自:https://www.jianshu.com/p/a8fa72e708d3 引出: 使用Handler的时候,其必须要跟一个Looper绑定.在UI线程可直接初始化Handler来使用.但是 ...
- Android Framework 分析---2消息机制Native层
在Android的消息机制中.不仅提供了供Application 开发使用的java的消息循环.事实上java的机制终于还是靠native来实现的.在native不仅提供一套消息传递和处理的机制,还提 ...
- Win32窗口消息机制 x Android消息机制 x 异步执行
如果你开发过Win32窗口程序,那么当你看到android代码到处都有的mHandler.sendEmptyMessage和 private final Handler mHandler = new ...
- windows消息机制(转)
1. 引言Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛.Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序员不 ...
- 【转】浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- [转]Windows进程间通信的各种方法
http://www.cnblogs.com/songQQ/archive/2009/06/03/1495764.html 道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包) ...
- [转载] COM 套间
http://www.vckbase.com/index.php/wv/1315 简序 大学毕业前的最后一学期,在一家公司实习,当时的工作需要用到一些操作系统提供的组件.那时候只知道COM这个名词,并 ...
- MINIX3 进程通信分析
MINIX3 进程通信分析 6.1MINIX3 进程通信概要 MINIX3 的进程通信是 MINIX3 内核部分最重要的一个部件,我个人认为其实这 是内核中的“内核”,怎么来理解这个概念呢?其实 MI ...
随机推荐
- android一个弹出菜单的动画(二)
假设做一个弹出的控件,我们能够进行加入view: 写class SatelliteMenu extends FrameLayout private void init(Context context, ...
- JS判断只能是数字和小数点
JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'' ...
- stm32之USART通信
任何USART通信,需要用到2个对外连接的引脚:RxD,TxD: RxD是输入引脚,用于串行数据接收: TxD是输出引脚,用于串行数据发送: SCLK引脚:发生器时钟输出(同步模式下,异步模式下不需要 ...
- BZOJ 3668: [Noi2014]起床困难综合症( 贪心 )
之前以为xor,or,and满足结合律...然后连样例都过不了 早上上体育课的时候突然想出来了...直接处理每一位是1,0的最后结果, 然后从高位到低位贪心就可以了... 滚去吃饭了.. ------ ...
- Ajax,设置默认焦点以及判断是否为空
<style type="text/css"> .tishi{ color: red; } </style> <script type="t ...
- ELK 之二:ElasticSearch 和Logstash高级使用
一:文档 官方文档地址:1.x版本和2.x版本 https://www.elastic.co/guide/en/elasticsearch/guide/index.html 硬件要求: 1.内存,官方 ...
- Python获取并修改hosts
#!/usr/bin/env python #-*- coding: utf-8 -*- #谷歌host修改脚本 #author 坤子<root#pythonpy.com> #date 0 ...
- ORACLE存储过程笔记3
ORACLE存储过程笔记3 流程控制 1.条件 if expression thenpl/sql or sqlend if; if expression thenpl/sql or sqlel ...
- java入门(1) 程序运行机制及运行过程
首先我们来看一下java程序在底层是怎么工作的: JAVA有两种核心机制: Java虚拟机(Java Virtual Machine): 1.java虚拟机可以理解成一个以字节码为机器指令的CPU. ...
- python爬虫实战2百度贴吧爬html
转自:http://blog.csdn.net/wxg694175346/article/details/8927832 import string, urllib2 #定义百度函数 def baid ...