/********************************************************************
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.prepare() 错误的原因

    引用自: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消息机制(转)

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

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

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

  7. [转]Windows进程间通信的各种方法

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

  8. [转载] COM 套间

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

  9. MINIX3 进程通信分析

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

随机推荐

  1. 暂时和永久改动oracle sysdate的默认输出格式

    1.当前会话有效 alter session set NLS_DATE_FORMAT='YYYY-MM-DD:HH24:MI:SS'; 2.永久生效 sys用户登入后运行例如以下命令 然后重新启动数据 ...

  2. 淘宝PK京东:哥刷的不是广告,刷的是存在

    冯强/文 (昨晚看阿根廷vs瑞士时手机上敲的,看完太激动忘发了,现配了图发上来) 这两天,关于京东.淘宝渠道下沉的新闻中,两家略带喜感的农村墙体广告在互联网上传播,例如以下图: 京东这图片,越看越像P ...

  3. win8系统特别慢的基本判断方法

    单位有6,7台同事的电脑是win8.1.不知道什么原因,两位领导反映电脑特别慢. 我查看了一下,确实很慢. 虽然知道win8系统不好,但也不至于这样. 打开任务管理器,看了一下cpu和内存的使用状态, ...

  4. Android访问网络(可以正常使用)

    以下是MainActiviy.java,有必要的注释,里面用到了handler,以及线程,workThread如何更新mainThread才能够更新的内容. package com.wyl.httpt ...

  5. centos下pg_dump的服务器版本不匹配问题

    pg_dump: server version: 9.4.4; pg_dump version: 8.2.4 pg_dump: aborting because of server version m ...

  6. PyconChina2015丁来强Pydata Ecosystem

    pydata ecosystem基于python的数据分析生态系统 0. Agenda Data Science ecosystem Data Wrangling Data Analysis Data ...

  7. Python 迭代器、生成器、递归、正则表达式 (四)

    一.迭代器&生成器 1.迭代器仅仅是一容器对象,它实现了迭代器协议.它有两个基本方法: 1)next 方法 返回容器的下一个元素 2)_iter_方法 返回迭代器自身.迭代器可以使用内建的it ...

  8. Raphael Js矢量库API简介:

    Raphael Js矢量库API简介:Raphael Javascript 是一个 Javascript的矢量库. 2010年6月15日,著名的JavaScript库ExtJS与触摸屏代码库项目jQT ...

  9. GIT分支操作常用命令

    切换分支:git checkout name 撤销修改:git checkout -- file 删除文件:git rm file 查看状态:git status 添加记录:git add file ...

  10. HttpComponents 也就是以前的httpclient项目

    HttpComponents 也就是以前的httpclient项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端/服务器编程工具包,并且它支持 HTTP 协议最新的版本和建议.不 ...