115 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef _BASE_MQ_H_
 | |
| #define _BASE_MQ_H_
 | |
| 
 | |
| #include "os_def.h"
 | |
| #include "container/binary_list.h"
 | |
| 
 | |
| 
 | |
| template <typename MSG_T, typename RESP_T>
 | |
| class BaseMQ
 | |
| {
 | |
| public:
 | |
| 
 | |
| 	struct MsgData
 | |
| 	{
 | |
| 		uint64_t id_;
 | |
| 		MSG_T msg_;
 | |
| 		time_t timeout_;
 | |
| 		//重载相等判断的运算符
 | |
| 		inline bool operator == (const MsgData& data) const
 | |
| 		{
 | |
| 			return id_ == data.id_;
 | |
| 		}
 | |
| 		//重载不等判断的运算符
 | |
| 		inline bool operator != (const MsgData& data) const
 | |
| 		{
 | |
| 			return id_ != data.id_;
 | |
| 		}
 | |
| 		inline bool operator > (const MsgData& data) const
 | |
| 		{
 | |
| 			return id_ > data.id_;
 | |
| 		}
 | |
| 		inline bool operator >= (const MsgData& data) const
 | |
| 		{
 | |
| 			return id_ >= data.id_;
 | |
| 		}
 | |
| 		inline bool operator < (const MsgData& data) const
 | |
| 		{
 | |
| 			return id_ < data.id_;
 | |
| 		}
 | |
| 		inline bool operator <= (const MsgData& data) const
 | |
| 		{
 | |
| 			return id_ <= data.id_;
 | |
| 		}
 | |
| 	};
 | |
| 
 | |
| 	BaseMQ():msgid_(0xffffffff), timeout_t_(10)
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	BaseMQ(int timeout):msgid_(0xffffffff), timeout_t_(timeout)
 | |
| 	{
 | |
| 	}
 | |
| 
 | |
| 	virtual ~BaseMQ()
 | |
| 	{
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	void Run()
 | |
| 	{
 | |
| 		time_t curr_t = NOW_T;
 | |
| 		for (int i = msg_list_.count() - 1; i >= 0; --i)
 | |
| 		{
 | |
| 			MsgData& data = msg_list_[i];
 | |
| 			if (curr_t > data.timeout_)
 | |
| 			{
 | |
| 				msg_list_.remove(i);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	uint64_t AddMsg(MSG_T& msg)
 | |
| 	{
 | |
| 		++msgid_;
 | |
| 
 | |
| 		MsgData data;
 | |
| 		data.msg_ = msg;
 | |
| 		data.id_ = msgid_;
 | |
| 		data.timeout_ = NOW_T + timeout_t_;
 | |
| 
 | |
| 		msg_list_.add_item(data);
 | |
| 
 | |
| 		return msgid_;
 | |
| 	}
 | |
| 
 | |
| 	void RemoveMsg(uint64_t id)
 | |
| 	{
 | |
| 		MsgData data;
 | |
| 		data.id_ = id;
 | |
| 		msg_list_.remove_item(data);
 | |
| 	}
 | |
| 
 | |
| 	void RecvResp(uint64_t id, RESP_T& resp)
 | |
| 	{
 | |
| 		MsgData data;
 | |
| 		data.id_ = id;
 | |
| 		int idx = msg_list_.find(data);
 | |
| 		if (idx >= 0)
 | |
| 		{
 | |
| 			MsgData& msg_data = msg_list_[idx];
 | |
| 			OnResp(msg_data.msg_, resp);
 | |
| 			msg_list_.remove(idx);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	virtual void OnResp(MSG_T& data, RESP_T& resp) = 0;
 | |
| 
 | |
| private:
 | |
| 	uint64_t msgid_;
 | |
| 	int	timeout_t_;
 | |
| 	BinaryList<MsgData>	msg_list_;
 | |
| };
 | |
| 
 | |
| #endif
 |