ACE_Task를 사용할 때는 쓰레드 정책과 메세지 정책을 미리 결정해야 합니다.
쓰레드 정책은 얼마나 많은 쓰레드를 사용하지, 쓰레드를 어떻게 종료할지, 쓰레드와 메세지 큐는 어떻게 연결할지에 대한 정책입니다. open, svc 함수에서 관련 정책을 결정합니다.
메세지 정책은 외부에서 전달된 메세지를 어떻게 사용할지에 대한 정책으로 put 함수에서 관련 정책을 결정합니다.
Task1.cpp
// Task1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <ace/ACE.h>
#include "SimpleTask.h"
#include <iostream>
#include <string>
int _tmain(int argc, _TCHAR* argv[])
{
ACE::init();
SimpleTask st;
st.open();
std::string cmd;
while(true){
std::cout<<"새로운 데이터를 입력하세요. 종료하고 싶다면 exit를 입력하세요."<<std::endl;
std::getline( std::cin, cmd);
if (cmd == "exit"){
st.cmd_close();
break;
}
ACE_Message_Block* data = new ACE_Message_Block( cmd.size()+1 );
data->copy( cmd.c_str(), cmd.size());
data->copy("\0",1);
st.put( data);
}
system("pause");
ACE::fini();
return 0;
}
SimpleTask.h
#pragma once
#include <ace/Task.h>
class SimpleTask:public ACE_Task<ACE_MT_SYNCH>
{
public:
SimpleTask(void);
~SimpleTask(void);
virtual int open (void *args = 0);
virtual int svc (void);
void cmd_close();
virtual int put (ACE_Message_Block *, ACE_Time_Value * = 0);
};
SimpleTask.cpp
#include "SimpleTask.h"
#include <iostream>
SimpleTask::SimpleTask(void)
{
}
SimpleTask::~SimpleTask(void)
{
}
int
SimpleTask::open (void *args /*= 0*/){
return this->activate(THR_NEW_LWP | THR_JOINABLE | THR_INHERIT_SCHED, 3);
}
int
SimpleTask::svc (void){
ACE_Message_Block* data;
while(true){
if(-1 != this->getq(data)){
std::cout<<std::endl<< "Thread ID:"<< ACE_OS::thr_self() <<" data:"<< (char*)data->rd_ptr()<<std::endl;
data->release();
continue;
}
if(EWOULDBLOCK == errno){
continue;
}
if( ESHUTDOWN == errno){
break;
}
}
return 0;
}
void
SimpleTask::cmd_close(){
this->flush();
this->wait();
}
int
SimpleTask::put (ACE_Message_Block * data, ACE_Time_Value * vt){
return this->putq( data, vt);
}