ジャーナルウェア
46761 ワード
/********************************************************************
* : 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_Sign m_delete_sign;
MAP_TYPE m_evt_listener_table;
typename VCT_TYPE::iterator m_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_Server m_pass_server;
Vote_Server m_vote_server;
Action_Server m_action_server;
Response_Server m_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;
};
// Trace
class 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
", title_table[p_buf->par1], p_buf->par2);
}
/********************************************************************
* : 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 once
#include <map>
using namespace std;
template< 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;
// Trace
template< class _ID_TYPE >
class Title_Table
{
public:
virtual ~Title_Table(){}
//
void open(){ title_table.clear(); }
//
void close(){ title_table.clear(); }
//
void set_title(_ID_TYPE _sign, const TCHAR* _title){ title_table[_sign] = _title; }
//
void clear_title(_ID_TYPE _sign){ title_table[_sign] = _T(""); }
//
const TCHAR* get_title( _ID_TYPE _sign ){ return title_table[_sign]; }
protected:
map<_ID_TYPE, const TCHAR*> title_table;
};
/********************************************************************
* : ITime_Axis.h
* :
* : ,2012 11 17
* : 1.0
* :
********************************************************************/
#pragma once
#include <map>
using namespace std;
#define G_TIME_AXIS_MODULE_NAME 1
//
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_TYPE time_grids;
MAP_TYPE::iterator m_nonius;
Delete_Sign* mp_delete_sign;
};
template< class _ITime_Axis >
class TimerSink: public ITimerSink
{
public:
TimerSink( _ITime_Axis* _p_itime_axis ):mp_itime_axis(_p_itime_axis){}
virtual ~TimerSink(){}
//
virtual void get_timer_sink( long _user_sign, long _delay_time, long _interval_time )
{
mp_itime_axis->set_time_tgr(this, _user_sign, _delay_time, _interval_time);
}
//
virtual void release_timer_sink( long _user_sign )
{
mp_itime_axis->kill_time_tgr(this, _user_sign);
}
private:
_ITime_Axis* mp_itime_axis;
};
template< class _ITime_Axis, class _Fun >
class Fun_Time_Tgr: public TimerSink< _ITime_Axis >
{
public:
Fun_Time_Tgr( _ITime_Axis* _p_itime_axis, const _Fun& _fun, long _delay_time, long _interval_time )
:TimerSink<_ITime_Axis>(_p_itime_axis), m_fun(_fun)
{
get_timer_sink(1, _delay_time, _interval_time)
}
virtual ~Fun_Time_Tgr()
{
release_timer_sink(1);
}
//
virtual void on_time( long _user_sign )
{
m_fun();
}
private:
_Fun m_fun;
};
template< class _ITime_Axis, class _PtrObj, class _MemFn >
class MemFun_Time_Tgr: public TimerSink< _ITime_Axis >
{
public:
MemFun_Time_Tgr( _ITime_Axis* _p_itime_axis, const _PtrObj& _p_obj, _MemFn _p_menfn, long _delay_time, long _interval_time )
:TimerSink<_ITime_Axis>(_p_itime_axis), m_p_obj(_p_obj), m_p_memfn(_p_menfn)
{
get_timer_sink(1, _delay_time, _interval_time);
}
virtual ~MemFun_Time_Tgr()
{
release_timer_sink(1);
}
//
virtual void on_time( long _user_sign )
{
((*m_p_obj).*m_p_memfn)();
}
private:
_PtrObj m_p_obj;
_MemFn m_p_memfn;
};
template< class _ITime_Axis, class _Fun >
Fun_Time_Tgr<_ITime_Axis, _Fun>* new_fun_time_tgr_impl( _ITime_Axis* _p_itime_axis, const _Fun& _fun, long _delay_time, long _interval_time)
{
Fun_Time_Tgr<_ITime_Axis, _Fun>* p_tgr = new Fun_Time_Tgr<_ITime_Axis, _Fun>(_p_itime_axis, _fun, _delay_time, _interval_time);
if( NULL == p_tgr){ /*Log */ }
return p_tgr;
}
template< class _ITime_Axis, class _PtrObj, class _MemFn >
MemFun_Time_Tgr<_ITime_Axis, _PtrObj, _MemFn>* new_memfn_time_tgr_impl( _ITime_Axis* _p_itime_axis, const _PtrObj& _p_obj, _MemFn _p_menfn, long _delay_time, long _interval_time)
{
MemFun_Time_Tgr<_ITime_Axis, _PtrObj, _MemFn>* p_tgr = new MemFun_Time_Tgr<_ITime_Axis, _PtrObj, _MemFn>(_p_itime_axis, _p_obj, _p_menfn, _delay_time, _interval_time);
if( NULL == p_tgr){ /*Log */ }
return p_tgr;
}
#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;
long user_sign;
long delay_time;
long interval_time;
long left_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_TYPE m_delete_objs;
typename MAP_TYPE::iterator m_nonius;
Delete_Sign m_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;
};
#pragma once
#include "..//Game_Module//Time_Axis.h"
class App_SetSize
{
public:
App_SetSize(long _delay_time, long _interval_time);
virtual ~App_SetSize();
//
virtual void update_setsize();
private:
ITimerSink* mp_timer;
};
#include "stdafx.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")
#include "App_Center.h"
App_SetSize::App_SetSize(long _delay_time, long _interval_time)
{
mp_timer = new_memfn_time_tgr_impl(App_Center::get_time_axis(), this, &App_SetSize::update_setsize, _delay_time, _interval_time);
}
App_SetSize::~App_SetSize()
{
RETURN_IF_NULL(mp_timer);
delete mp_timer;
mp_timer = NULL;
}
void App_SetSize::update_setsize()
{
CServer_KillerDlg* p_dlg = App_Center::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 += '
';
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
";
DWORD cur_PeakWorkingSetSize = pmc.PeakWorkingSetSize/1024;
_ltow(cur_PeakWorkingSetSize, num, 10);
text += " : ";
text += num;
text += "K
";
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 += "+ : ";
else
text += "- : ";
text += num;
text += "K
";
long dt_PeakWorkingSetSize = cur_PeakWorkingSetSize - old_PeakWorkingSetSize;
_ltow(dt_PeakWorkingSetSize, num, 10);
if( dt_PeakWorkingSetSize >= 0)
text += "+ : ";
else
text += "- : ";
text += num;
text += "K
";
sum_WorkingSetSize = sum_WorkingSetSize + dt_WorkingSetSize;
_ltow(sum_WorkingSetSize, num, 10);
text += " : ";
text += num;
text += "K
";
sum_PeakWorkingSetSize = sum_PeakWorkingSetSize + dt_PeakWorkingSetSize;
_ltow(sum_PeakWorkingSetSize, num, 10);
text += " : ";
text += num;
text += "K
";
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 += "
";
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_Center::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 += "
";
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,
Game_Server = 5,
Game_Client = 6,
};
};
class ILog_Trace;
class ITime_Axis;
class CServer_KillerDlg;
struct App_Center
{
virtual ~App_Center(){}
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 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();
static IEvt_Server<>* get_skill_server();
static Delete_Proxy* get_delete_proxy();
static void trace_open(long _sign, const TCHAR* _title);
static void trace_close(long _sign);
static void trace_print(long _sign, TCHAR* _p_text);
};
#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"
#include "..//Game_Skill//SKL_Prepare.h"
struct APP_MODULE_NAME{};
struct APP_SKILL{};
typedef Proxy_Factory< APP_MODULE_NAME, IEvt_Server<>, Evt_Server<> > LOG_SERVER;
typedef Proxy_Factory< APP_SKILL, IEvt_Server<>, Evt_Server<> > SKILL_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, App_SetSize, App_SetSize > SETSIZE_SERVER;
typedef Proxy_Factory< APP_MODULE_NAME, Delete_Proxy, Delete_Proxy > DELETE_PROXY_SERVER;
void App_Center::open()
{
SKILL_SERVER::open();
LOG_SERVER::open();
TIME_AXIS_SERVER::open();
UID_FACTORY_SERVER::open();
UNIT_FACTORY_SERVER::open();
ILOG_TRACE_SERVER::open( get_log_server() );
DELETE_PROXY_SERVER::open();
trace_open( Module_Name::Game_App, _T(" ") );
trace_open( Module_Name::Game_Server, _T(" ") );
trace_open( Module_Name::Game_Client, _T(" ") );
trace_print( Module_Name::Game_App, _T(" ") );
trace_print( Module_Name::Game_App, _T(" ") );
trace_print( Module_Name::Game_App, _T(" ID ") );
trace_print( Module_Name::Game_App, _T(" ") );
new PLAN_SKL();
new BREAK_SKL();
}
void App_Center::close()
{
trace_print( Module_Name::Game_App, _T(" ") );
trace_print( Module_Name::Game_App, _T(" ") );
trace_print( Module_Name::Game_App, _T(" ID ") );
trace_print( Module_Name::Game_App, _T(" ") );
trace_close( Module_Name::Game_App );
trace_close( Module_Name::Game_Server );
trace_close( Module_Name::Game_Client );
close_setsize();
DELETE_PROXY_SERVER::close();
ILOG_TRACE_SERVER::close();
UNIT_FACTORY_SERVER::close();
UID_FACTORY_SERVER::close();
TIME_AXIS_SERVER::close();
LOG_SERVER::close();
SKILL_SERVER::close();
}
void App_Center::open_setsize()
{
SETSIZE_SERVER::open(0, 3000);
trace_print( Module_Name::Game_App, _T(" ") );
}
void App_Center::close_setsize()
{
SETSIZE_SERVER::close();
trace_print( Module_Name::Game_App, _T(" ") );
}
void App_Center::open_log()
{
trace_open( Module_Name::Game_ServerDlg, _T(" ") );
trace_open( Module_Name::Time_Axis, _T(" ") );
trace_open( Module_Name::Test_Module, _T("GM") );
}
void App_Center::close_log()
{
trace_close( Module_Name::Game_ServerDlg );
trace_close( Module_Name::Time_Axis );
trace_close( Module_Name::Test_Module );
}
IEvt_Server<>* App_Center::get_log_server()
{
return LOG_SERVER::get_proxy();
}
IEvt_Server<>* App_Center::get_skill_server()
{
return SKILL_SERVER::get_proxy();
}
CServer_KillerDlg* App_Center::get_main_dlg()
{
return gp_Game_ServerDlg;
}
ITime_Axis* App_Center::get_time_axis()
{
return TIME_AXIS_SERVER::get_proxy();
}
UID_Factory< long >* App_Center::get_uid_factory()
{
return UID_FACTORY_SERVER::get_proxy();
}
Unit_Factory< long >* App_Center::get_unit_factory()
{
return UNIT_FACTORY_SERVER::get_proxy();
}
Delete_Proxy* App_Center::get_delete_proxy()
{
return DELETE_PROXY_SERVER::get_proxy();
}
void App_Center::trace_open(long _sign, const TCHAR* _title)
{
if( NULL != ILOG_TRACE_SERVER::get_proxy() )
ILOG_TRACE_SERVER::get_proxy()->open( _sign, _title );
}
void App_Center::trace_close(long _sign)
{
if( NULL != ILOG_TRACE_SERVER::get_proxy() )
ILOG_TRACE_SERVER::get_proxy()->close( _sign );
}
void App_Center::trace_print(long _sign, TCHAR* _p_text)
{
if( NULL != ILOG_TRACE_SERVER::get_proxy() )
ILOG_TRACE_SERVER::get_proxy()->print( _sign, _p_text );
}