消息机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 ...
随机推荐
- javascript 生成页面轮播元素
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> ...
- gcc支持c99验证
gcc3.0以上的版本都是支持C99标准的, 但是编译程序的时候需要加上 -std=c9 才可以: 一下程序是验证gcc是否支持c99标准的: #include <stdio.h> ...
- 机器学习笔记(一)- from Andrew Ng的教学视频
最近算是一段空闲期,不想荒废,记得之前有收藏一个机器学习的链接Andrew Ng的网易公开课,其中的overfiting部分做组会报告时涉及到了,这几天有时间决定把这部课程学完,好歹算是有个粗浅的认识 ...
- MFC工程的复制
MFC工程的复制 [1] 在VS中新建一个同类型的MFC工程. [2] 复制.rc资源文件,用记事本打开旧工程和新工程的.rc文件,将旧工程的对应部分复制到新工程的对应部分,文 ...
- (转)Free函数的参数一定要是malloc返回的那个指针
Free函数的参数一定要是malloc返回的那个指针 之前认为只要free的参数在malloc分配的区域之内就可以了, 现在发现不对的.在嵌入式里分配堆都是按照块来的,只要在这个块内系统就能识别, ...
- Week6(10月17日):周末别忘记运动
Part I:提问 =========================== 1.多对多.一对多关系的数据实体模型,如何创建? 已知汽车4S店需开发一个客户关系管理系统(CRM),请为其中的客户和汽车 ...
- QSplashScreen无法背景透明的解决办法(强制StyleSheet生效)
setWindowFlags(Qt::WindowStaysOnTopHint | Qt::SplashScreen | Qt::FramelessWindowHint); setAttribute( ...
- 基于visual Studio2013解决C语言竞赛题之0502最小数替换
题目
- 自己定义progressdialog,改善用户体验
自己定义progressdialog,改善用户体验 效果图: 详细实现方式: 1.定义Dialog的Layout布局 2.设置动画anim 3.创建自己定义dialog的样式 4.创建共同拥有方法来控 ...
- android JB2连拍降速原理介绍
1.HAL层 (1)alps\mediatek\platform\mt6589\hardware\camera\core\camshot\MultiShot\MultiShot.cpp sleep实现 ...