ACE主动对象模式

文章介绍了如何使用ACE框架实现主动对象模式,涉及到ACE_Task_Base、ACE_Activation_Queue和ACE_Method_Request三个关键类。通过CActivateDispatch作为分发器,管理多线程和请求队列,而CActivateObject则作为分发对象,包含在命令队列中。当从队列中取出命令时,会切换到相应的线程上下文执行call方法。
摘要由CSDN通过智能技术生成

 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;
 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值