ACE_Message_Queue는 ACE_Message_Block을 위한 전용 컨테이너 입니다. 제가 알기로는 ACE에는 특정 자료형을 위한 전용 컨테이너는 이거 하나 밖에 없을 겁니다. 그만큼 Message_Block이 중요한 class이고 함께 사용하면 유용한 기능들도 많습니다. 그 중 하나인 Message_Queue에 있는 Message_Block을 꺼내지 않고 iterating하는 기능을 소개합니다.
보통 Queue에 들어있는 element를 iterating 하려면 Queue의 특성상 다 꺼내야 합니다. 하지만 Message_Block의 next()함수를 사용하면 꺼내지 않고도 iterating이 가능합니다.
먼저 일반 Queue처럼 꺼내는 방법 입니다.
Message_Block의 next() 메소드를 이용한 iterating
next() 메소드를 cont() 메소드와 혼동 하실수도 있는데,
보통 Queue에 들어있는 element를 iterating 하려면 Queue의 특성상 다 꺼내야 합니다. 하지만 Message_Block의 next()함수를 사용하면 꺼내지 않고도 iterating이 가능합니다.
먼저 일반 Queue처럼 꺼내는 방법 입니다.
ACE_Message_Queue<ACE_NULL_SYNCH> queue;
// 사이즈가 1~10 인 block을 넣음
for (int i=1; i<11; ++i)
{
ACE_Message_Block* block0 = new ACE_Message_Block(i);
queue.enqueue_tail(block0);
}
// 10개 들어갔나 확인
ACE_DEBUG((LM_INFO,"Message Count(%d) Bytes(%d)\n", queue.message_count(), queue.message_bytes()));
ACE_Message_Block* block0 = NULL;
// 꺼내서 출력
while(queue.dequeue_head(block0) != -1)
ACE_DEBUG((LM_INFO,"Message Block Size(%d)\n", block0->size()));
// empty
ACE_DEBUG((LM_INFO,"Message Count(%d)\n", queue.message_count()));
Message_Block의 next() 메소드를 이용한 iterating
ACE_Message_Queue<ACE_NULL_SYNCH> queue;
// 사이즈가 1~10 인 block을 넣음
for (int i=1; i<11; ++i)
{
ACE_Message_Block* block0 = new ACE_Message_Block(i);
queue.enqueue_tail(block0);
}
// 10개 들어갔나 확인
ACE_DEBUG((LM_INFO,"Message Count(%d) Bytes(%d)\n", queue.message_count(), queue.message_bytes()));
ACE_Message_Block* block0 = NULL;
// 꺼내지 않고 첫번째 block을 가져옴
queue.peek_dequeue_head(block0);
do
{
ACE_DEBUG((LM_INFO,"Message Block Size(%d)\n", block0->size()));
} while( (block0 = block0->next()) != NULL );
// 여전히 10개
ACE_DEBUG((LM_INFO,"Message Count(%d)\n", queue.message_count()));
next() 메소드를 cont() 메소드와 혼동 하실수도 있는데,
- cont() 메소드는 ACE_Message_Block을 링크드 리스트로 구성할 때 사용
- next() 메소드는 ACE_Message_Queue안에 들어있는 다음 블럭을 구할때 사용



덧글