消息池

来源:互联网 发布:php 扩展 不成功 编辑:程序博客网 时间:2024/06/03 22:59
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){//池子里面没有了 就newm = 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();

原创粉丝点击