草稿版

来源:互联网 发布:deep dark fears知乎 编辑:程序博客网 时间:2024/04/27 14:02
/*********************************************************************  文件名:   Bind_Par.h*  文件描述: 参数绑定器*  创建人:   陈泽丹 ,2012年10月25日     *  版本号:   1.0*  备注:     每次打包参数以做网络通讯的传递太麻烦了, 所以封装绑定参数的操作。 其中利用模板参和偏特化无关联的特性,让使用者可采用参数来区分,而不是采用模板名不同来区分********************************************************************/#pragma once#define RETURN_IF_NULL( _buf ) if( NULL == _buf ) return#define RETURN_IF_NO_NULL( _buf ) if( NULL != _buf ) return#define DELETE_POINT( _buf ) if( NULL != _buf ) { delete _buf; _buf = NULL; }  #define TYPELIST_1(T1) \Typelist<T1, NullType>#define TYPELIST_2(T1, T2) \Typelist<T1, TYPELIST_1(T2) >#define TYPELIST_3(T1, T2, T3) \Typelist<T1, TYPELIST_2(T2, T3) >#define TYPELIST_4(T1, T2, T3, T4) \Typelist<T1, TYPELIST_3(T2, T3, T4) >#define TYPELIST_5(T1, T2, T3, T4, T5) \Typelist<T1, TYPELIST_4(T2, T3, T4, T5) >class NullType {};  template <class T, class U>  struct Typelist  {  typedef T Head;  typedef U Tail;  }; template <class TList>struct Bind_Par;template <class _P1>struct Bind_Par< TYPELIST_1(_P1) >{public:typedef _P1 Parm1;Parm1 par1;Bind_Par< TYPELIST_1(Parm1) >( Parm1 _par1): par1(_par1){}};template <class _P1, class _P2>struct Bind_Par< TYPELIST_2(_P1, _P2) >{public:typedef _P1 Parm1;typedef _P2 Parm2;Parm1 par1;Parm2 par2;Bind_Par< TYPELIST_2(Parm1, Parm2) >( Parm1 _par1, Parm2 _par2): par1(_par1), par2(_par2){}};template <class _P1, class _P2, class _P3>struct Bind_Par< TYPELIST_3(_P1, _P2, _P3) >{public:typedef _P1 Parm1;typedef _P2 Parm2;typedef _P3 Parm3;Parm1 par1;Parm2 par2;Parm3 par3;Bind_Par< TYPELIST_3(Parm1, Parm2, Parm3) >( Parm1 _par1, Parm2 _par2, Parm3 _par3): par1(_par1), par2(_par2), par3(_par3){}};template <class _P1, class _P2, class _P3, class _P4>struct Bind_Par< TYPELIST_4(_P1, _P2, _P3, _P4) >{public:typedef _P1 Parm1;typedef _P2 Parm2;typedef _P3 Parm3;typedef _P4 Parm4;Parm1 par1;Parm2 par2;Parm3 par3;Parm4 par4;Bind_Par< TYPELIST_4(Parm1, Parm2, Parm3, Parm4) >( Parm1 _par1, Parm2 _par2, Parm3 _par3, Parm4 _par4): par1(_par1), par2(_par2), par3(_par3), par4(_par4){}};template <class _P1, class _P2, class _P3, class _P4, class _P5>struct Bind_Par< TYPELIST_5(_P1, _P2, _P3, _P4, _P5) >{public:typedef _P1 Parm1;typedef _P2 Parm2;typedef _P3 Parm3;typedef _P4 Parm4;typedef _P5 Parm5;Parm1 par1;Parm2 par2;Parm3 par3;Parm4 par4;Parm5 par5;Bind_Par< TYPELIST_5(Parm1, Parm2, Parm3, Parm4, Parm5) >( Parm1 _par1, Parm2 _par2, Parm3 _par3, Parm4 _par4, Parm5 _par5): par1(_par1), par2(_par2), par3(_par3), par4(_par4), par5(_par5){}};

/*********************************************************************  文件名:   Server.h*  文件描述: 网络游戏模拟*  创建人:   陈泽丹 ,2012年11月16日     *  版本号:   1.0*  修改记录:********************************************************************/#pragma oncetemplate< class _Name, class _I, class _N >class Proxy_Factory{public:static void open(){  if( NULL == m_p_proxy )m_p_proxy = new _N;}template< class _Par >static void open( _Par par){  if( NULL == m_p_proxy )m_p_proxy = new _N( par );}template< class _Par1, class _Par2 >static void open( _Par1 par1, _Par2 _par2 ){  if( NULL == m_p_proxy )m_p_proxy = new _N( par1, _par2 );}static void close(){ if( NULL != m_p_proxy ){delete m_p_proxy;m_p_proxy = NULL;}}static _I* get_proxy(){ return m_p_proxy; }private:static _I* m_p_proxy;};template< class _Name, class _I, class _N >_I* Proxy_Factory< _Name, _I, _N >::m_p_proxy = NULL;

/*********************************************************************  文件名:   Server.h*  文件描述: 网络游戏模拟*  创建人:   陈泽丹 ,2012年9月6日     *  版本号:   1.0*  修改记录:********************************************************************/#pragma once#include <iostream>#include <vector>#include <map>#include <algorithm>//--风格:编译期类型有大写, 执行期类型用小写using namespace std;namespace Evt_Server_Space{//消息class Msg_Head{public:Msg_Head(void* _sub_buf, const long _sub_id = 1):m_data(_sub_buf, _sub_id){};virtual ~Msg_Head(){}template<class _TYPE>void get_sub_buf(_TYPE*& _p_buf, const long _sub_id = 1){_p_buf =  (m_data.second == _sub_id)? (_TYPE*)m_data.first : NULL;}private:pair<void*, const long> m_data;};// 事件决策者订阅者接口template< class _TMsg = Msg_Head >struct IPass_Event_Listener{ virtual ~IPass_Event_Listener<_TMsg>(){};typedef _TMsg Msg;virtual bool on_pass(Msg *_p_msg) = 0; };// 事件否决者订阅者接口template< class _TMsg = Msg_Head >struct IVote_Event_Listener{ virtual ~IVote_Event_Listener<_TMsg>(){};typedef _TMsg Msg;virtual bool on_vote(Msg *_p_msg) = 0; };// 行为执行者订阅者接口template< class _TMsg = Msg_Head >struct IAction_Event_Listener{ virtual ~IAction_Event_Listener<_TMsg>(){};typedef _TMsg Msg;virtual void on_action(Msg *_p_msg) = 0; };// 事件响应者订阅者接口template< class _TMsg = Msg_Head >struct IResponse_Event_Listener{ virtual ~IResponse_Event_Listener<_TMsg>(){};typedef _TMsg Msg;virtual void on_response(Msg *_p_msg) = 0; };// 事件服务器 -- 事件驱动,消息处理template< class _TEvt = long, class _TMsg = Msg_Head>class IEvt_Server{public:virtual ~IEvt_Server(){};typedef IPass_Event_Listener< _TMsg >PASS_LISTENER_TYPE;typedef IVote_Event_Listener< _TMsg >VOTE_LISTENER_TYPE;typedef IAction_Event_Listener< _TMsg >ACTION_LISTENER_TYPE;typedef IResponse_Event_Listener< _TMsg >RESPONSE_LISTENER_TYPE;//监控时以事件为要素virtual bool add_listener(const _TEvt _event,PASS_LISTENER_TYPE* _p_listener)= 0;virtual void remove_listener(const _TEvt _event,PASS_LISTENER_TYPE* _p_listener)= 0;virtual bool add_listener(const _TEvt _event,VOTE_LISTENER_TYPE* _p_listener)= 0;virtual void remove_listener(const _TEvt _event,VOTE_LISTENER_TYPE* _p_listener)= 0;virtual bool add_listener(const _TEvt _event,ACTION_LISTENER_TYPE* _p_listener)= 0;virtual void remove_listener(const _TEvt _event,ACTION_LISTENER_TYPE* _p_listener)= 0;virtual bool add_listener(const _TEvt _event,RESPONSE_LISTENER_TYPE* _p_listener)= 0;virtual void remove_listener(const _TEvt _event,RESPONSE_LISTENER_TYPE* _p_listener)= 0;//处理时以消息为要素virtual void dispatch_pass_msg(const _TEvt _event, _TMsg *_p_msg) = 0;virtual void dispatch_vote_msg(const _TEvt _event, _TMsg *_p_msg) = 0;};template< class _TEvt = long, class _TMsg = Msg_Head >class Evt_Server: public IEvt_Server< _TEvt, _TMsg >{public:virtual bool add_listener(const _TEvt _event, PASS_LISTENER_TYPE* _p_listener){ return m_pass_server.add_listener(_event, _p_listener); }virtual void remove_listener(const _TEvt _event, PASS_LISTENER_TYPE* _p_listener){  m_pass_server.remove_listener(_event, _p_listener); }virtual bool add_listener(const _TEvt _event, VOTE_LISTENER_TYPE* _p_listener){ return m_vote_server.add_listener(_event, _p_listener); }virtual void remove_listener(const _TEvt _event, VOTE_LISTENER_TYPE* _p_listener){  m_vote_server.remove_listener(_event, _p_listener); }virtual bool add_listener(const _TEvt _event, ACTION_LISTENER_TYPE* _p_listener){ return m_action_server.add_listener(_event, _p_listener); }virtual void remove_listener(const _TEvt _event, ACTION_LISTENER_TYPE* _p_listener){  m_action_server.remove_listener(_event, _p_listener); }virtual bool add_listener(const _TEvt _event, RESPONSE_LISTENER_TYPE* _p_listener){ return m_response_server.add_listener(_event, _p_listener); }virtual void remove_listener(const _TEvt _event, RESPONSE_LISTENER_TYPE* _p_listener){  m_response_server.remove_listener(_event, _p_listener); }virtual void dispatch_pass_msg(const _TEvt _event, _TMsg *_p_msg){if( m_pass_server.dispatch_msg( _event, _p_msg ) ){m_action_server.dispatch_msg( _event, _p_msg );m_response_server.dispatch_msg( _event, _p_msg );}}virtual void dispatch_vote_msg(const _TEvt _event, _TMsg *_p_msg) {if( m_vote_server.dispatch_msg( _event, _p_msg ) ){m_action_server.dispatch_msg( _event, _p_msg );m_response_server.dispatch_msg( _event, _p_msg );}}protected://基服template< typename _LISTENER_TYPE >class Server{public:typedef vector< _LISTENER_TYPE* >VCT_TYPE;typedef map<_TEvt, VCT_TYPE >MAP_TYPE;Server(){ m_delete_sign.out_for(); }//订阅bool add_listener(const _TEvt _event, _LISTENER_TYPE* _p_listener) {VCT_TYPE& vct = m_evt_listener_table[_event];VCT_TYPE::iterator it = find( vct.begin(), vct.end(), _p_listener );if( vct.end() == it){vct.push_back(_p_listener);return true;}return false;}//取消void remove_listener(const _TEvt _event, _LISTENER_TYPE* _p_listener) {VCT_TYPE& vct = m_evt_listener_table[_event];VCT_TYPE::iterator it = find( vct.begin(), vct.end(), _p_listener );if( vct.end() != it){if( m_delete_sign.is_for() && it == m_nonius ){m_nonius = vct.erase(it);m_delete_sign.delete_in_for();}else vct.erase(it);}}//派发消息virtual bool dispatch_msg(const _TEvt _event, _TMsg *_p_msg)= 0;protected:class Delete_Sign{public:inline void in_for(){ operator_state = 1; }inline void out_for(){ operator_state = 0; }inline void delete_in_for(){ operator_state = 2;}inline bool is_for(){ return (operator_state >= 1)? true : false; }inline bool no_deletion(){ return (2 == operator_state)? false : true; }private:byte operator_state;};Delete_Signm_delete_sign;MAP_TYPEm_evt_listener_table;typenameVCT_TYPE::iteratorm_nonius;;};//通过class Pass_Server: public Server< PASS_LISTENER_TYPE >{public://派发消息bool dispatch_msg(const _TEvt _event, _TMsg *_p_msg) {bool failed = true;MAP_TYPE::iterator pass_it = m_evt_listener_table.find( _event );if( m_evt_listener_table.end() != pass_it){VCT_TYPE& vct = pass_it->second;for( m_nonius = vct.begin(); vct.end() != m_nonius;){m_delete_sign.in_for();VCT_TYPE::const_iterator it = m_nonius;if( (*it)->on_pass(_p_msg) ){//有一票通过failed = true;break;}if( m_delete_sign.no_deletion() )m_nonius++;}}m_delete_sign.out_for();if( failed ) return false;else return true;}};//否决class Vote_Server: public Server< VOTE_LISTENER_TYPE >{public://派发消息bool dispatch_msg(const _TEvt _event, _TMsg *_p_msg) {bool ret = true;MAP_TYPE::iterator vote_it = m_evt_listener_table.find( _event );if( m_evt_listener_table.end() != vote_it){VCT_TYPE& vct = vote_it->second;for( m_nonius = vct.begin(); vct.end() != m_nonius;){m_delete_sign.in_for();VCT_TYPE::const_iterator it = m_nonius;if( (*it)->on_vote(_p_msg) ){//有否决票ret = false;break;}if( m_delete_sign.no_deletion() )m_nonius++;}}m_delete_sign.out_for();return ret;}};//执行class Action_Server: public Server< ACTION_LISTENER_TYPE >{public://派发消息bool dispatch_msg(const _TEvt _event, _TMsg *_p_msg) {MAP_TYPE::iterator pass_it = m_evt_listener_table.find( _event );if( m_evt_listener_table.end() != pass_it){VCT_TYPE& vct = pass_it->second;for( m_nonius = vct.begin(); vct.end() != m_nonius;){m_delete_sign.in_for();VCT_TYPE::const_iterator it = m_nonius;(*it)->on_action(_p_msg);if( m_delete_sign.no_deletion() )m_nonius++;}}m_delete_sign.out_for();return true;}};//响应class Response_Server: public Server< RESPONSE_LISTENER_TYPE >{public://派发消息bool dispatch_msg(const _TEvt _event, _TMsg *_p_msg) {MAP_TYPE::iterator pass_it = m_evt_listener_table.find( _event );if( m_evt_listener_table.end() != pass_it){VCT_TYPE& vct = pass_it->second;for( m_nonius = vct.begin(); vct.end() != m_nonius;){m_delete_sign.in_for();VCT_TYPE::const_iterator it = m_nonius;(*it)->on_response(_p_msg);if( m_delete_sign.no_deletion() )m_nonius++;}}m_delete_sign.out_for();return true;}};Pass_Serverm_pass_server;Vote_Serverm_vote_server;Action_Serverm_action_server;Response_Serverm_response_server;};}

/*********************************************************************  文件名:   Server.h*  文件描述: 网络游戏模拟*  创建人:   陈泽丹 ,2012年11月16日     *  版本号:   1.0*  修改记录:********************************************************************/#pragma once#include "Evt_Server.h"using namespace Evt_Server_Space;struct ILog_Trace{virtual ~ILog_Trace(){}//打开输出开关virtual void open(long _sign, const TCHAR* _title) = 0;//关闭输出开关virtual void close(long _sign) = 0;//输出调试语句virtual void print(long _sign, TCHAR* _p_text) = 0;}; //常用Traceclass Log_Trace: public ILog_Trace, public IAction_Event_Listener<>{public:Log_Trace(IEvt_Server<>* _p_log_server):mp_log_server(_p_log_server){ }virtual ~Log_Trace(){ mp_log_server = NULL;  }//打开输出开关void open(long _sign, const TCHAR* _title);//关闭输出开关void close(long _sign);//输出调试语句void print(long _sign, TCHAR* _p_text);protected:// 事件响应者订阅者接口virtual void on_action(Msg *_p_msg);map<long, const TCHAR*> title_table;IEvt_Server<>* mp_log_server;}; 

#include "stdafx.h"#include "Log_Server.h"#include "Map_Par_Binder.h"//打开输出开关void Log_Trace::open(long _sign, const TCHAR* _title){ RETURN_IF_NULL(_title);mp_log_server->add_listener(_sign, this ); title_table[_sign] = _title;}//关闭输出开关void Log_Trace::close(long _sign){ mp_log_server->remove_listener(_sign, this ); }//输出调试语句void Log_Trace::print(long _sign, TCHAR* _p_text){ mp_log_server->dispatch_vote_msg( _sign, &Msg_Head( &Bind_Par< TYPELIST_2(long,TCHAR*) >(_sign,_p_text) ) ); }// 事件响应者订阅者接口void Log_Trace::on_action(Msg *_p_msg){Bind_Par< TYPELIST_2(long, TCHAR*) >* p_buf = NULL;_p_msg->get_sub_buf(p_buf);RETURN_IF_NULL( p_buf );TRACE2("%s : %s\n", title_table[p_buf->par1], p_buf->par2);}

/*********************************************************************  文件名:   ITime_Axis.h*  文件描述: 参数绑定器*  创建人:   陈泽丹 ,2012年11月17日     *  版本号:   1.0*  备注:     ********************************************************************/#pragma once#include <map>using namespace std;#define  G_TIME_AXIS_MODULE_NAME1// 定时器回调接口struct ITimerSink{virtual ~ITimerSink(){}// 定时器回调virtual void on_time(long _user_sign) = 0;};//时间辅接口struct ITime_Axis{virtual ~ITime_Axis(){}//增加计时器virtual void set_time_tgr( ITimerSink* _p_time_tgr, long _user_sign, long _delay_time, long _interval_time ) = 0;//减少计时器virtual void kill_time_tgr( ITimerSink* _p_time_tgr, long _user_sign ) = 0;//模糊计时virtual void on_vague_time() = 0;//精确计时virtual void on_exact_time() = 0;};//时间轴struct Time_Grid;struct Delete_Sign;class Time_Axis: public ITime_Axis{public:Time_Axis();virtual ~Time_Axis();//增加计时器void set_time_tgr( ITimerSink* _p_time_tgr, long _user_sign, long _delay_time, long _interval_time );//减少计时器void kill_time_tgr( ITimerSink* _p_time_tgr, long _user_sign );//模糊计时void on_vague_time();//精确计时void on_exact_time();private:typedef map< pair<ITimerSink*, long>, Time_Grid* >MAP_TYPE;MAP_TYPEtime_grids;MAP_TYPE::iteratorm_nonius;Delete_Sign*mp_delete_sign;};

#include "stdafx.h"#include "Time_Axis.h"#include <map>using namespace std;struct Time_Grid{Time_Grid(ITimerSink* _p_time_tgr, long _user_sign, long _delay_time, long _interval_time):p_time_tgr(_p_time_tgr), user_sign(_user_sign), delay_time(_delay_time), interval_time(_interval_time), left_time(_interval_time){}ITimerSink* p_time_tgr;longuser_sign;longdelay_time;longinterval_time;longleft_time;};class Delete_Sign{public:inline void in_for(){ operator_state = 1; }inline void out_for(){ operator_state = 0; }inline void delete_in_for(){ operator_state = 2;}inline bool is_for(){ return (operator_state >= 1)? true : false; }inline bool no_deletion(){ return (2 == operator_state)? false : true; }private:byte operator_state;};//时间轴接口Time_Axis::Time_Axis(){ mp_delete_sign = new Delete_Sign(); mp_delete_sign->out_for(); }Time_Axis::~Time_Axis(){ delete mp_delete_sign; mp_delete_sign = NULL; }//增加计时器void Time_Axis::set_time_tgr( ITimerSink* _p_time_tgr, long _user_sign, long _delay_time, long _interval_time ){kill_time_tgr( _p_time_tgr, _user_sign );time_grids[ make_pair(_p_time_tgr, _user_sign) ] = new Time_Grid(_p_time_tgr, _user_sign, _delay_time, _interval_time);}//减少计时器void Time_Axis::kill_time_tgr( ITimerSink* _p_time_tgr, long _user_sign ){map< pair<ITimerSink*,long>, Time_Grid* >::iterator it = time_grids.find( make_pair(_p_time_tgr, _user_sign) );if( time_grids.end() != it ){if( mp_delete_sign->is_for() && it == m_nonius ){delete it->second;m_nonius = time_grids.erase(it);mp_delete_sign->delete_in_for();}else {delete it->second;time_grids.erase(it);}}}//模糊计时void Time_Axis::on_vague_time(){const long tm_grid_unit = 20;static DWORD tm_start = GetTickCount();DWORD tm_cur = GetTickCount();long tm_dt = tm_cur - tm_start;if( tm_dt >= tm_grid_unit ){tm_start = tm_cur;for( m_nonius = time_grids.begin(); time_grids.end() != m_nonius; ){mp_delete_sign->in_for();MAP_TYPE::iterator it = m_nonius;Time_Grid* p_time_grid = it->second;if( p_time_grid->delay_time >= 0){p_time_grid->delay_time = p_time_grid->delay_time - tm_dt;if( p_time_grid->delay_time<= 0){p_time_grid->delay_time = p_time_grid->delay_time - tm_dt;p_time_grid->p_time_tgr->on_time( p_time_grid->user_sign );}}else{p_time_grid->left_time = p_time_grid->left_time - tm_dt;if( p_time_grid->left_time <= 0 ){p_time_grid->left_time = p_time_grid->interval_time;p_time_grid->p_time_tgr->on_time( p_time_grid->user_sign );}}if( mp_delete_sign->no_deletion() )m_nonius++;mp_delete_sign->out_for();}}}//精确计时void Time_Axis::on_exact_time(){const long tm_grid_unit = 20;static unsigned long tm_start = GetTickCount();unsigned long tm_cur = GetTickCount();long tm_dt = tm_cur - tm_start;if( tm_dt >= tm_grid_unit ){tm_start = tm_cur;for( m_nonius = time_grids.begin(); time_grids.end() != m_nonius;){mp_delete_sign->in_for();MAP_TYPE::iterator it = m_nonius;Time_Grid* p_time_grid = it->second;if( p_time_grid->delay_time >= 0){p_time_grid->delay_time = p_time_grid->delay_time - tm_grid_unit;if( p_time_grid->delay_time<= 0){p_time_grid->delay_time = p_time_grid->delay_time - tm_grid_unit;p_time_grid->p_time_tgr->on_time( p_time_grid->user_sign );}}else{p_time_grid->left_time = p_time_grid->left_time - tm_grid_unit;if( p_time_grid->left_time <= 0 ){p_time_grid->left_time = p_time_grid->interval_time;p_time_grid->p_time_tgr->on_time( p_time_grid->user_sign );}}if( mp_delete_sign->no_deletion() )m_nonius++;mp_delete_sign->out_for();}}}

/*********************************************************************  文件名:   Server.h*  文件描述: 网络游戏模拟*  创建人:   陈泽丹 ,2012年11月16日     *  版本号:   1.0*  修改记录:********************************************************************/#pragma once#include <map>#include <vector>using namespace std;//生物工厂template< class _ID_TYPE >class Unit_Factory{public:Unit_Factory(){ m_delete_sign.out_for(); }virtual ~Unit_Factory(){ delete_accessorys();  }//订阅template<class _T>bool push_single(_ID_TYPE _uid, _T* _p_obj){MAP_TYPE::iterator it = m_delete_objs.find(_uid);if( m_delete_objs.end() == it ){m_delete_objs[_uid] = new Die_Single<_T>(_p_obj);return true;}return false;}//订阅template<class _T>bool push_array(_ID_TYPE _uid, _T* _p_obj){MAP_TYPE::iterator it = m_delete_objs.find(_uid);if( m_delete_objs.end() == it ){m_delete_objs[_uid] = new Die_Array<_T>(_p_obj);return true;}return false;}//取得生物指针void* get_unit(_ID_TYPE _uid){MAP_TYPE::iterator it = m_delete_objs.find(_uid);if( m_delete_objs.end() != it ){void* p_ret = NULL;it->second->get_accessory(p_ret);return p_ret;}return NULL;}//取消void pop(_ID_TYPE _uid){MAP_TYPE::iterator it = m_delete_objs.find(_uid);if( m_delete_objs.end() != it ){if( m_delete_sign.is_for() && it == m_nonius ){delete it->second;m_nonius = m_delete_objs.erase(it);m_delete_sign.delete_in_for();}else {delete it->second;m_delete_objs.erase(it);}}}private://删除相关附件void delete_accessorys(){//回调for(m_nonius = m_delete_objs.begin(); m_delete_objs.end() != m_nonius; ){m_delete_sign.in_for();MAP_TYPE::iterator cur = m_nonius;cur->second->delete_accessory(); if( m_delete_sign.no_deletion() )m_nonius++;m_delete_sign.out_for();}//清空for(m_nonius = m_delete_objs.begin(); m_delete_objs.end() != m_nonius; ){m_delete_sign.in_for();MAP_TYPE::iterator cur = m_nonius;pop(cur->first);if( m_delete_sign.no_deletion() )m_nonius++;m_delete_sign.out_for();}m_delete_objs.clear();}class Delete_Sign{public:inline void in_for(){ operator_state = 1; }inline void out_for(){ operator_state = 0; }inline void delete_in_for(){ operator_state = 2;}inline bool is_for(){ return (operator_state >= 1)? true : false; }inline bool no_deletion(){ return (2 == operator_state)? false : true; }private:byte operator_state;};//代理项struct IDeleteSink{ virtual ~IDeleteSink(){}virtual void get_accessory(void *&_p) = 0;virtual void delete_accessory() = 0;};//绑定附件template<class _T>struct Die_Single:public IDeleteSink{ Die_Single(_T* _p):m_p(_p){}void get_accessory(void *&_p){ _p = m_p; }void delete_accessory(){ delete m_p; } _T* m_p;};//绑定附件template<class _T>struct Die_Array:public IDeleteSink{ Die_Array(_T* _p):m_p(_p){}void get_accessory(void *&_p){ _p = m_p; }void delete_accessory(){ delete[] m_p; } _T* m_p;};//记录typedef map< _ID_TYPE, IDeleteSink* >MAP_TYPE;MAP_TYPEm_delete_objs;typename MAP_TYPE::iteratorm_nonius;Delete_Signm_delete_sign;};//删除代理class Delete_Proxy: public Unit_Factory< void* >{public://订阅template<class _T>bool push_single(_T* _p_obj){return Unit_Factory< void* >::push_single( _p_obj, _p_obj );}//订阅template<class _T>bool push_array(_T* _p_obj){return Unit_Factory< void* >::push_array( _p_obj, _p_obj );}};

#include<vector>using namespace std;template< class _ID_TYPE >class UID_Factory{public:typedef pair<_ID_TYPE, _ID_TYPE>ITIM;UID_Factory(){ res.push_back( make_pair(1, 99999999) ); }_ID_TYPE create_uid(){if( res.size() > 0 ){_ID_TYPE ret = res[0].first;res[0].first++;if( res[0].first > res[0].second){res[0] = res[ res.size() - 1];res.pop_back();}return ret;}return 0;}bool create_need_uid(_ID_TYPE _uid){if( res.size() > 0 ){long len = res.size();for(long i=0; i<len; ++i){if( _uid >= res[i].first && _uid <= res[i].second){_ID_TYPE s = res[i].first;_ID_TYPE e = res[i].second;res[i] = res[res.size()-1];res.pop_back();if( _uid > s){res.push_back( make_pair(s, _uid-1) );}if( _uid < e){res.push_back( make_pair(_uid+1, e) );}return true;}}}return false;}void delete_uid(_ID_TYPE _uid){long len = res.size();for(long i=0; i<len; ++i){if( _uid >= res[i].first && _uid <= res[i].second)return;}res.push_back( make_pair(_uid, _uid) );if( res.size() > 50 )tidy_res();}void tidy_res(){bool is_reflash = false;do {is_reflash = false;for(long i=0; i<res.size()-1; ++i){for(long j=i+1; j<res.size(); ++j){bool is_mixed = true;if( (res[i].second + 1 < res[j].first) || (res[j].second + 1 < res[i].first) )is_mixed = false;if( is_mixed ){_ID_TYPE s = min( res[i].first, res[j].first );_ID_TYPE e = max( res[i].second, res[j].second );res[i] = make_pair(s,e);res[j] = res[res.size()-1];res.pop_back();is_reflash = true;}}}} while ( is_reflash );}private:friend void show_uid_res(UID_Factory *_p_uid_factory);vector< ITIM > res;};


//App_Module

 

#pragma once#include "..//Game_Module//Time_Axis.h"class App_SetSize: public ITimerSink{public:App_SetSize(long _delay_time, long _interval_time);virtual ~App_SetSize();// 定时器回调virtual void on_time(long _user_sign);};


 

#include "stdafx.h"#include "App_Center.h"#include "App_SetSize.h"#include "..//Game_Module//Map_Par_Binder.h"#include "..//Game_Module//Time_Axis.h"#include "..//Server_KillerDlg.h"#include <psapi.h>   #pragma comment(lib,"psapi.lib") App_SetSize::App_SetSize(long _delay_time, long _interval_time){ App_Server::get_time_axis()->set_time_tgr(this, 1, _delay_time, _interval_time); }App_SetSize::~App_SetSize(){ ITime_Axis* p_timer = App_Server::get_time_axis();RETURN_IF_NULL(p_timer);p_timer->kill_time_tgr(this, 1); }// 定时器回调void App_SetSize::on_time(long _user_sign){CServer_KillerDlg* p_dlg = App_Server::get_main_dlg();RETURN_IF_NULL(p_dlg);static long  time_count = 1;static DWORD sum_WorkingSetSize = 0;static DWORD sum_PeakWorkingSetSize = 0;static DWORD old_WorkingSetSize = 0;static DWORD old_PeakWorkingSetSize = 0;TCHAR num[64];CString text = _T("");_ltow(time_count, num, 10);text += num;text += '\n';PROCESS_MEMORY_COUNTERS pmc;HANDLE handle = GetCurrentProcess();  GetProcessMemoryInfo(handle,&pmc,sizeof(pmc));  DWORD cur_WorkingSetSize = pmc.WorkingSetSize/1024;_ltow(cur_WorkingSetSize, num, 10);text += "内存使用: ";text += num;text += "K\n";DWORD cur_PeakWorkingSetSize = pmc.PeakWorkingSetSize/1024;_ltow(cur_PeakWorkingSetSize, num, 10);text += "峰值内存: ";text += num;text += "K\n";if( old_WorkingSetSize != cur_WorkingSetSize || old_PeakWorkingSetSize != cur_PeakWorkingSetSize) {++time_count;long dt_WorkingSetSize = cur_WorkingSetSize - old_WorkingSetSize;_ltow(dt_WorkingSetSize, num, 10);if( dt_WorkingSetSize >= 0)text += "+ 内存使用较上一次增长量: ";elsetext += "- 内存使用较上一次增长量: ";text += num;text += "K\n";long dt_PeakWorkingSetSize = cur_PeakWorkingSetSize - old_PeakWorkingSetSize;_ltow(dt_PeakWorkingSetSize, num, 10);if( dt_PeakWorkingSetSize >= 0)text += "+ 峰值内存较上一次增长量: ";elsetext += "- 峰值内存较上一次增长量: ";text += num;text += "K\n";sum_WorkingSetSize = sum_WorkingSetSize + dt_WorkingSetSize;_ltow(sum_WorkingSetSize, num, 10);text += "内存使用总增长: ";text += num;text += "K\n";sum_PeakWorkingSetSize = sum_PeakWorkingSetSize + dt_PeakWorkingSetSize;_ltow(sum_PeakWorkingSetSize, num, 10);text += "峰值内存总增长: ";text += num;text += "K\n";old_WorkingSetSize = cur_WorkingSetSize;old_PeakWorkingSetSize = cur_PeakWorkingSetSize;CString dlg_text = _T("");p_dlg->m_main_dlg_richedit_setsize.GetWindowText(dlg_text); dlg_text += text;dlg_text += "\n";p_dlg->m_main_dlg_richedit_setsize.SetWindowText(dlg_text);}}


 

#pragma once#include "App_Center.h"#include "..//Game_Module//Log_Server.h"class App_Log_Trace: public Log_Trace{public:App_Log_Trace(IEvt_Server<>* _p_output_server);// 事件响应者订阅者接口virtual void on_action(Msg *_p_msg);}; 


 

#include "stdafx.h"#include "..//Game_Module//Map_Par_Binder.h"#include "App_Log_Trace.h"#include "App_Center.h"#include "..//Server_KillerDlg.h"App_Log_Trace::App_Log_Trace( IEvt_Server<>* _p_output_server ):Log_Trace(_p_output_server){}void App_Log_Trace::on_action(Msg *_p_msg){CServer_KillerDlg* p_dlg = App_Server::get_main_dlg();RETURN_IF_NULL(p_dlg);Log_Trace::on_action(_p_msg);Bind_Par< TYPELIST_2(long, TCHAR*) >* p_buf = NULL;_p_msg->get_sub_buf(p_buf);RETURN_IF_NULL( p_buf );CString text = _T("");p_dlg->m_main_dlg_richedit.GetWindowText(text); text += title_table[p_buf->par1];text += ": ";text += p_buf->par2;text += "\n";p_dlg->m_main_dlg_richedit.SetWindowText(text);p_dlg->m_main_dlg_richedit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0);}


 

#pragma once#include "..//Game_Module//Evt_Server.h"#include "..//Game_Module//UID_Factory.h"#include "..//Game_Module//Unit_Factory.h"using namespace Evt_Server_Space;struct Module_Name{enum MODULE {Game_ServerDlg= 1,Time_Axis= 2,Test_Module= 3,Game_App= 4,};};class ILog_Trace;class ITime_Axis;class CServer_KillerDlg;struct App_Server{virtual ~App_Server(){}static void open();static void close();static void open_setsize();static void close_setsize();static void open_log();static void close_log();static IEvt_Server<>*get_log_server();static ILog_Trace*get_log_trace();static CServer_KillerDlg*get_main_dlg();static ITime_Axis*get_time_axis();static UID_Factory< long >*get_uid_factory();static Unit_Factory< long >*get_unit_factory();};


 

#include "stdafx.h"#include "App_Center.h"#include "..//Game_Module//Map_Par_Binder.h"#include "..//Game_Module//Proxy_Factory.h"#include "..//Game_Module//Time_Axis.h"#include "App_Log_Trace.h"#include "..//Server_KillerDlg.h"#include "App_SetSize.h"struct APP_MODULE_NAME{};typedef Proxy_Factory< APP_MODULE_NAME, IEvt_Server<>, Evt_Server<> >LOG_SERVER;typedef Proxy_Factory< APP_MODULE_NAME, ITime_Axis, Time_Axis >TIME_AXIS_SERVER;typedef Proxy_Factory< APP_MODULE_NAME, UID_Factory< long >, UID_Factory< long > >UID_FACTORY_SERVER;typedef Proxy_Factory< APP_MODULE_NAME, Unit_Factory< long >, Unit_Factory< long > >UNIT_FACTORY_SERVER;typedef Proxy_Factory< APP_MODULE_NAME, ILog_Trace, App_Log_Trace >ILOG_TRACE_SERVER;typedef Proxy_Factory< APP_MODULE_NAME, ITimerSink, App_SetSize >SETSIZE_SERVER;void App_Server::open(){LOG_SERVER::open();TIME_AXIS_SERVER::open();UID_FACTORY_SERVER::open();UNIT_FACTORY_SERVER::open();ILOG_TRACE_SERVER::open( get_log_server() );get_log_trace()->open( Module_Name::Game_App,_T("游戏进程") );get_log_trace()->print( Module_Name::Game_App, _T("开启日志服") );get_log_trace()->print( Module_Name::Game_App, _T("开启时间服") );get_log_trace()->print( Module_Name::Game_App, _T("开启ID分配服") );get_log_trace()->print( Module_Name::Game_App, _T("开启生物工厂") );}void App_Server::close(){ILog_Trace* p_trace = get_log_trace();if( NULL != p_trace){get_log_trace()->print( Module_Name::Game_App, _T("关闭日志服") );get_log_trace()->print( Module_Name::Game_App, _T("关闭时间服") );get_log_trace()->print( Module_Name::Game_App, _T("关闭ID分配服") );get_log_trace()->print( Module_Name::Game_App, _T("关闭生物工厂") );get_log_trace()->close( Module_Name::Game_App );}close_setsize();ILOG_TRACE_SERVER::close();UNIT_FACTORY_SERVER::close();UID_FACTORY_SERVER::close();TIME_AXIS_SERVER::close();LOG_SERVER::close();}void App_Server::open_setsize(){SETSIZE_SERVER::open(0, 3000);ILog_Trace* p_trace = get_log_trace();RETURN_IF_NULL(p_trace);p_trace->print( Module_Name::Game_App,_T("开启内存监控") );}void App_Server::close_setsize(){SETSIZE_SERVER::close();ILog_Trace* p_trace = get_log_trace();RETURN_IF_NULL(p_trace);p_trace->print( Module_Name::Game_App,_T("关闭内存监控") );}void App_Server::open_log(){get_log_trace()->open( Module_Name::Game_ServerDlg, _T("控件") );get_log_trace()->open( Module_Name::Time_Axis,_T("时间轴") );get_log_trace()->open( Module_Name::Test_Module,_T("GM") );}void App_Server::close_log(){get_log_trace()->close( Module_Name::Game_ServerDlg );get_log_trace()->close( Module_Name::Time_Axis );get_log_trace()->close( Module_Name::Test_Module );}IEvt_Server<>* App_Server::get_log_server(){return LOG_SERVER::get_proxy();}ILog_Trace* App_Server::get_log_trace(){return ILOG_TRACE_SERVER::get_proxy();}CServer_KillerDlg* App_Server::get_main_dlg(){return gp_Game_ServerDlg;}ITime_Axis* App_Server::get_time_axis(){return TIME_AXIS_SERVER::get_proxy();}UID_Factory< long >*App_Server::get_uid_factory(){return UID_FACTORY_SERVER::get_proxy();}Unit_Factory< long >*App_Server::get_unit_factory(){return UNIT_FACTORY_SERVER::get_proxy();}


 

原创粉丝点击