#define MAX_MESSAGE_NUMBER  100
#define MAX_MESSAGE_SIZE    128
#define MAX_PROCESS_NAME    32

#include <boost/interprocess/ipc/message_queue.hpp>
#include <boost/interprocess/creation_tags.hpp>
#include <iostream>
using namespace boost::interprocess;

class CMessageQ
{

public:
  CMessageQ(const char* pName)
  {
    m_pMsgQ = NULL;
    strcpy(m_Name, pName);
  }
  ~CMessageQ(void)
  {
	  Remove();
  }

public:
  bool Create()
  {
	  try{
			Remove();
			// 메모리에서 제거되면 안되므로 static으로 선언
			static message_queue mq(create_only, m_Name, MAX_MESSAGE_NUMBER, MAX_MESSAGE_SIZE);
			m_pMsgQ = &mq;
	  }catch(interprocess_exception &ex){
		  std::cout << "MessageQ Create() error : " << ex.what() << std::endl;
		  return false;
	  }
	  return true;
  }

  bool Open()
  {
	  try{
		  static message_queue mq(open_only, m_Name);
      m_pMsgQ = &mq;
	  }catch(interprocess_exception &ex){
		  std::cout << "MessageQ Open() error : " << ex.what() << std::endl;
		  return false;
	  }
	  return true;
  }

  size_t Get()
  { 
    size_t temp;
    try{
    temp = m_pMsgQ->get_num_msg();
    return temp;
    }catch(interprocess_exception &ex){
      std::cout << "MessageQ Get() error : " << ex.what() << std::endl;
    }
    return 0;
  }

  template <typename T>
  bool Send(T* Data,size_t Size, unsigned int priority = 0)
  {
	  try{
		  m_pMsgQ->send(Data, Size, priority);
	  }catch(interprocess_exception &ex){
		  std::cout << "MessageQ Send() error : " << ex.what() << std::endl;
		  return false;
	  }
	  return true;
  }

  template <typename T>
  bool Recv(T* Data, size_t Size, unsigned int& priority)
  {
    size_t recvd_size=0;
	  try{
			//m_pMsgQ->receive(Data, Size, recvd_size, priority);
			m_pMsgQ->receive(Data, MAX_MESSAGE_SIZE, recvd_size, priority);
			if( Size != recvd_size )
			{
				std::cout << "MessageQ Recv() Size Wrong : " << std::endl;
				return false;
			}
	  }catch(interprocess_exception &ex){
		  std::cout << "MessageQ Recv() error : " << ex.what() << std::endl;
		  return false;
	  }
	  return true;
  }

  void Remove()
  {
	  message_queue::remove(m_Name);
  }

private:
	char m_Name[MAX_PROCESS_NAME]; // 프로세스 이름
	message_queue* m_pMsgQ; // 메시지큐 포인터
};


이렇게 사용하면 될려나 ㅡㅡ; ㅎㅎ

+ Recent posts