定时器C++版

来源:互联网 发布:动漫资讯网站知乎 编辑:程序博客网 时间:2024/06/11 04:08
/*********************************************************************  文件名:   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;


 

/*********************************************************************  文件名:   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;};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:_Funm_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:_PtrObjm_p_obj;_MemFnm_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;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();}}}


 

#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_Server::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_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);}//测试直接干掉的情况是否满足delete mp_timer;mp_timer = NULL;}


 

原创粉丝点击