智能指针实现代码--定时器实例

话不多说,直接看实现源码。

// 单线程模型,自增减没有互斥处理
class SingleThread
{
public:
	static long _Increment(long* p){ return ++(*p); }
	static long _Decrement(long* p){ return --(*p); }

};
// 计数器类
template<class ThreadModel = SingleThread>
class Counter
{
public:
	Counter() : _m_val(0){}
	long _Increment(){ return ThreadModel::_Increment(&_m_val); }
	long _Decrement(){ return ThreadModel::_Decrement(&_m_val); }
	long _GetCount(){ return _m_val; }
private:
	long _m_val;
};

template<class T>
class _MemPtr : public T
{
public:
	_MemPtr(){}
private:
	long _Increment();
	long _Decrement();
};
// 普通对象智能指针模板类,参数T必须从Counter继承
template<class T>
class MemPtr
{
public:
	MemPtr() : m_p(NULL){}
	MemPtr(T* p) : m_p(p){ AddRef(); }	// ,
	MemPtr(const MemPtr<T>& s) : m_p(s.m_p){ AddRef(); }
	~MemPtr(){ Release(); }
	MemPtr<T>& operator=(const MemPtr<T>& r)
	{
		if(m_p != r.m_p){ Release(); m_p = r.m_p; AddRef(); }
		return *this;
	}
	operator T*() { return m_p; }
	_MemPtr<T>* operator->() const { return (_MemPtr<T>*)m_p; }
	bool operator==(const MemPtr<T>& r) const{ return m_p == r.m_p; }
	bool operator!=(const MemPtr<T>& r) const{ return m_p != r.m_p; }
	bool operator!() const{ return !m_p; }
	operator bool() const{ return m_p != NULL; }
	void Attach(T* p){ Release(); m_p = p; }
	T* Detach(){ T* p = m_p; m_p = NULL; return p; }
	void Release()
	{
		if(m_p)
		{
			if(m_p->_Decrement() == 0){ delete m_p; }
			m_p = NULL;
		}
	}
	T* Copy() { AddRef(); return m_p; }
	long GetRef() const		// Used for debugging
	{
		if(m_p) return m_p->_GetCount(); return -1;
	}
	T* m_p;					// 请勿直接改写此变量
protected:
	void AddRef(){ if(m_p) m_p->_Increment(); }
};


以下是基于智能指针的定时器简单实现:

typedef unsigned long ULONG;
typedef unsigned __int64 UINT64;


class CTimer
{
public:
	CTimer(){}
	~CTimer(){}
public:
	void RegisterTimer( UINT64 id, ULONG period, UINT64 times );
	void UnRegisterTimer( UINT64 id );
	void RunTimer();
private:
	struct _TimerInfo : public Counter<>
	{
		ULONG ulLastTime;
		ULONG ulNextTime;
		ULONG ulPeriod;
		UINT64 uiTimes;
		_TimerInfo():uiTimes(0),ulLastTime(0),ulNextTime(0),ulPeriod(0){}
	};
	typedef map< UINT64, SmartPointer<_TimerInfo> >_TimerMap;
	_TimerMap m_timer;

	static UINT64 m_id;

};

UINT64 CTimer::m_id = 0;

void CTimer::RegisterTimer( UINT64 id, ULONG period, UINT64 times )
{
	SmartPointer<_TimerInfo> timer(new _TimerInfo);
	timer->ulLastTime = ::GetTickCount();
	timer->ulNextTime = timer.m_p->ulLastTime + period;
	timer->ulPeriod = period;
	timer->uiTimes = times;
	//m_id += 1;
	m_timer.insert(make_pair(id, timer));
}

void CTimer::UnRegisterTimer(UINT64 id)
{
	_TimerMap::iterator iter = m_timer.find(id);
	if( iter != m_timer.end())
	{
		m_timer.erase(id);
	}
}

void CTimer::RunTimer()
{
	while( 1 )
	{
		_TimerMap::iterator iter = m_timer.begin();
		for( ;iter != m_timer.end(); ++iter)
		{
			ULONG now = ::GetTickCount();
			if( now >= iter->second->ulNextTime  )
			{
				if( m_id == 3 ) break;
				printf("timer id is:%d\n",iter->first);
				iter->second->ulLastTime = now;
				iter->second->ulNextTime = now + iter->second->ulPeriod;
				m_id += 1;
			}
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	CTimer timer;
	//timer.RegisterTimer(1, 1000, 5);
	timer.RegisterTimer(2, 2000, 3);
	timer.RunTimer();
	
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值