ACE主动对象模式实现至少涉及3个类模块:
1:提供多线程池ACE_Task_Base或者ACE_Task或者ACE_Thread_Manager.
2:提供请求排队的ACE_Activation_Queue,其内部维护了ACE_Message_Queue的message_block消息指针队列。
3:提供了ACE_Activation_Queue队列操作实例的ACE_Method_Request,ACE_Method_Request是command模式,最低消耗仅为实现其内部的call方法。
ACE主动对象实现需要依赖以上3个模块,至少构建2个类
1:分发器,负责将请求参数排队,并提供数个执行线程。
2:分发对象。请求队列的排队实例。
看一下主动对象模式实现,以下为最精简代码:
2 //分发器定义 class CActivateDispatch: public ACE_Task<ACE_MT_SYNCH> { public: virtual int open (void *args = 0) ; virtual int svc(void) ; void push(); private: ACE_Activation_Queue cmdQueue; // 命令队列 };
//分发对象定义
class CActivateObject: public ACE_Method_Request
{
public:
CActivateObject(CActivateDispatch *pDispatch) ;
public:
int call() ;
private:
CActivateDispatch* m_pDispatch ;
};
//分发器实现
int CActivateDispatch::open (void *args)
{
//创建数个线程
return activate (THR_NEW_LWP|THR_JOINABLE, ACE_OS::num_processors() + 2);
}
void CActivateDispatch::push()
{
//生成命令对象,插入到命令队列中
if(cmdQueue.is_full())
ACE_DEBUG((LM_WARNING,"[%D(%t)] queue full , put away the object\n"));
else
cmdQueue.enqueue(new CActivateObject(this));
}
int CActivateDispatch::svc ( )
{
while(true)
{
//遍历命令队列,执行命令
auto_ptr<ACE_Method_Request> mo(this->cmdQueue.dequeue ());
if (mo->call () == -1)
break;
}
return 0 ;
}
void CActivateDispatch::call()
{
//do something,执行环境已切换到线程上下文
}
//
//分发对象实现
CActivateObject::CActivateObject(CActivateDispatch *pDispatch)
{
//分发对象构造函数
this->m_pDispatch = pDispatch;
}
int CActivateObject::call()
{
//执行环境已切换到线程上下文
if(m_pOB == NULL )
return -1;
m_pDispatch->call();
return 0;
}