ACE_Message_Queue는 메세지가 입력되면 ACE_Reactor로부터 Notify 이벤트를 받을 수 있습니다.
MQ_Handler.h
#pragma once
#include <ace/Event_Handler.h>
#include <ace/Reactor_Notification_Strategy.h>
#include <ace/Synch.h>
#include <ace/Message_Queue.h>
class MQ_Handler:
public ACE_Event_Handler,
public ACE_Reactor_Notification_Strategy,
public ACE_Message_Queue<ACE_MT_SYNCH>
{
public:
explicit MQ_Handler(ACE_Reactor* reactor);
~MQ_Handler(void);
virtual int handle_output (ACE_HANDLE fd = ACE_INVALID_HANDLE);
};
MQ_Handler.cpp
#include "MQ_Handler.h"
#include <iostream>
MQ_Handler::MQ_Handler(ACE_Reactor* reactor)
:
ACE_Event_Handler(reactor),
ACE_Reactor_Notification_Strategy(reactor,this,ACE_Event_Handler::WRITE_MASK),
ACE_Message_Queue<ACE_MT_SYNCH>(ACE_Message_Queue::DEFAULT_HWM, ACE_Message_Queue::DEFAULT_LWM,this)
{
}
MQ_Handler::~MQ_Handler(void)
{
}
int
MQ_Handler::handle_output (ACE_HANDLE fd /*= ACE_INVALID_HANDLE*/){
std::cout<<std::endl<< "--Start--";
ACE_Message_Block* mdata;
if( -1==this->dequeue_head(mdata) ) return 0;
std::cout<< std::endl <<"msg data:"<< (const char*)mdata->rd_ptr();
std::cout<<std::endl<< "--End--";
mdata->release();
return 0;
}
MQ1.cpp
// MQ1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <ace/ACE.h>
#include "MQ_Handler.h"
#include <ace/Thread_Manager.h>
#include <iostream>
#include <string>
#include <ace/Reactor.h>
#include <ace/OS.h>
ACE_THR_FUNC_RETURN fn (void * obj){
MQ_Handler* mq =(MQ_Handler*) obj;
std::string cmd;
while(true){
std::cout<<std::endl<<"전송할 메세지를 입력하세요. 종료시 exit를 입력하세요."<<std::endl;
std::getline( std::cin, cmd );
if("exit"==cmd){
ACE_Reactor::instance()->end_reactor_event_loop();
break;
}
ACE_Message_Block* data = new ACE_Message_Block( cmd.size()+1);
data->copy( cmd.c_str() );
mq->enqueue_tail( data );
ACE_OS::sleep(1);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
ACE::init();
{
ACE_Reactor* reactor = ACE_Reactor::instance();
MQ_Handler mq( reactor);
reactor->register_handler( &mq, ACE_Event_Handler::NULL_MASK);
ACE_Thread_Manager tm;
tm.spawn( fn,&mq);
reactor->run_reactor_event_loop();
tm.wait();
system("pause");
}
ACE::fini();
return 0;
}