消息机4_B

时间:2021-10-27 01:50:24
/********************************************************************
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的更多相关文章

  1. chrome插件开发-消息机制中的bug与解决方案

    序言 最近开发chrome插件,涉及到消息传递机时按照教程去敲代码,结果总是不对.研究了大半天终于找到原因,现在记录下. 程序 插件程序参考官网 chrome官网之消息传递机制, 不能FQ的同事也可以 ...

  2. ThreadLocal ——android消息机制handler在非主线程创建not called Looper&period;prepare&lpar;&rpar; 错误的原因

    引用自:https://www.jianshu.com/p/a8fa72e708d3 引出: 使用Handler的时候,其必须要跟一个Looper绑定.在UI线程可直接初始化Handler来使用.但是 ...

  3. Android Framework 分析---2消息机制Native层

    在Android的消息机制中.不仅提供了供Application 开发使用的java的消息循环.事实上java的机制终于还是靠native来实现的.在native不仅提供一套消息传递和处理的机制,还提 ...

  4. Win32窗口消息机制 x Android消息机制 x 异步执行

    如果你开发过Win32窗口程序,那么当你看到android代码到处都有的mHandler.sendEmptyMessage和 private final Handler mHandler = new ...

  5. windows消息机制&lpar;转&rpar;

    1. 引言Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛.Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序员不 ...

  6. 【转】浅思OC的语言特性

    算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...

  7. &lbrack;转&rsqb;Windows进程间通信的各种方法

    http://www.cnblogs.com/songQQ/archive/2009/06/03/1495764.html 道相似,不过它传输数据是通过不可靠的数据报(如TCP/IP协议中的UDP包) ...

  8. &lbrack;转载&rsqb; COM 套间

    http://www.vckbase.com/index.php/wv/1315 简序 大学毕业前的最后一学期,在一家公司实习,当时的工作需要用到一些操作系统提供的组件.那时候只知道COM这个名词,并 ...

  9. MINIX3 进程通信分析

    MINIX3 进程通信分析 6.1MINIX3 进程通信概要 MINIX3 的进程通信是 MINIX3 内核部分最重要的一个部件,我个人认为其实这 是内核中的“内核”,怎么来理解这个概念呢?其实 MI ...

随机推荐

  1. spring加载过程,源码带你理解从初始化到bean注入

    spring在容器启动时,容器正式初始化入口refresh()如下图 ①包括初始化FactoryBean.解析XML注册所有BeanDefinition信息  ②包括注册scope管理类  ③初始化单 ...

  2. div&plus;css进度条

    效果图: 进度条代码: <style type="text/css"> 红色:background-color:f05153:border:1px solid #f05 ...

  3. Oracle 数据库二 基本查询

    查询当前用户:show user 查看当前用户下的表:select *from tab; 设置行宽: show linesize;(查看行宽)     set linesize 120;(设置行宽) ...

  4. 给ubuntu开通FTP功能

    一.安装vsftp安装: sudo apt-get install vsftpd 二.启动.停止.重启vsftp 启动vsftp:sudo service vsftpd start 三.创建ftp用户 ...

  5. Chrome developer tool:本人钟爱的 console、Network 功能简谈

    在最开始时,本人调试查看网页,一直用的是 firefox 的 firebug 插件,并没有使用 chrome 的 developer tool .只不过,在日常生活使用过程中,一直使用的是 chrom ...

  6. JavaScript正则表达式检验与递归函数实际应用

    JS递归函数(菲波那切数列) 实例解析: 一组数字:0  1  1  2  3  5  8  13                 0  1  2  3  4  5  6  7 sl(0)=0; sl ...

  7. Oracle之外键&lpar;Foreign Key&rpar;使用方法具体解释(二)- 级联删除(DELETE CASCADE)

    Oracle外键(Foreign Key)之级联删除(DELETE CASCADE) 目标 演示样例解说怎样在Oracle外键中使用级联删除 什么是级联删除(DELETE CASCADE)? 级联删除 ...

  8. HDU-4511-ac自动机&plus;dp

    小明系列故事——女友的考验 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  9. Windows 经典DOS命令大全

    copy \\ip\admin$\svv.exe c:\ 或:copy\\ip\admin$\*.* 复制对方admini$共享下的srv.exe文件(所有文件)至本地C: xcopy 要复制的文件或 ...

  10. Ubentu下命令行安装chrome浏览器

    前言: 最近在使用Ubuntu 系统.编译Android aosp 项目.准备写博客,但是Ubuntu 的默认浏览器 firefox 在写csdn 的时候,加载不出来.如下图 一直卡在这里. 这种情况 ...