消息池

class Message
{
public:
	Message(MessagePool* pool)
		:m_pool(pool)
	{
	}
	~Message()
	{
	}
public:
	void destroy()
	{
		//消息回收 进入池子
		if (m_pool != NULL)
		{
			m_pool->push(this);
		}
		else
		{
			delete this;
		}
	}
public:
	int proc;
	int content;
private:
	MessagePool* m_pool;	//每个消息对应一个池子对象,这个池子是产生它以及死亡后放进去的地方
};

class MessagePool
{
public:
	MessagePool(unsigned int initCount, unsigned int maxcount);//池子初始长度,最大长度(不能让他因为异常无限大,超过这个值不进池子)
	~MessagePool();
public:
	Message* pop();
	void push(Message* m);
private:
	//对象池 的核心实体池子 一个存储对象的队列safequeue(typedef SafeQueue<Message*> MessageList;)
	MessageList m_pool;

	unsigned int m_initcount;
	unsigned int m_maxcount;
};
MessagePool::MessagePool(unsigned int initCount, unsigned int maxcount)
	:m_initcount(initCount), m_maxcount(maxcount)
{
	for (unsigned int i = 0; i < initCount; i++)
	{
		Message* m = new Message(this);
		m_pool.push(m);
	}
}
MessagePool::~MessagePool()
{
	Message* m = NULL;
	while ((m = m_pool.pop()) != NULL)
	{
		delete m;
		m = NULL;
	}
}

Message* MessagePool::pop()
{
	Message* m = m_pool.pop();
	if (m == NULL)
	{
		//池子里面没有了 就new
		m = new Message(this);
	}
	return m;
}
void MessagePool::push(Message* m)
{
	if (m != NULL)
	{
		if (m_pool.ssize() >= static_cast<int>(m_maxcount))
		{
			//大了就删掉 不回收了
			delete m;
			m = NULL;
		}
		else
		{
			m_pool.push(m);
		}
	}
}


//Message* msg = new Message();
//delete msg;
//对象的产生于销毁,有了消息池,改为如下
MessagePool m_messagePool(0,2000);//所有消息的池子 这里面存储消息尸体 负责消息的重生于死亡
Message* msg = m_messagePool.pop();
msg->destroy();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值