ACE主动对象模式

news/2024/9/23 6:37:20/

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


http://www.ppmy.cn/news/481938.html

相关文章

一道SQL Server窗口函数的面试题

概要 本文介绍一道和SQL Server窗口函数相关的面试题&#xff0c;主要涉及窗口函数的原理和Framing参数的设置。 设计和实现 题目介绍 输入数据如下&#xff1a; 主要包括账户编号&#xff08;account_no&#xff09;&#xff0c;交易日期&#xff08;tran_date&#xff0…

四种网课框架模型,帮你轻松组织讲课内容

哈喽&#xff0c;大家好&#xff0c;我是海哥&#xff0c;知识付费变现创业教练&#xff0c;教育公司培训总监&#xff0c;从事知识付费变现咨询10年&#xff0c;已助力3000人实现知识付费变现。 当我们刚开始着手制作网课的时候&#xff0c;首先会遇到的问题就是不知道怎么填充…

强化学习从基础到进阶-案例与实践[2]:马尔科夫决策、贝尔曼方程、动态规划、策略价值迭代

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

dnf软件管理命令

dnf: ropolist##列出仓库信息 clean all##清除系统中已经加载的仓库储存信息 /var/cache/dnf list all##列出所有软件 list available##列出未安装软件 list installed##列出已安装软件 install##安装 remove##卸载 reinstall##重新安装 search##搜索…

CentOS 8 的 DNF 命令使用

DNF 是新一代的PMR软件包管理器&#xff0c;是 Yum包管理器的升级版。 DNF 使用 RPM, libsolv 和 hawkey 库进行包管理操作。 Yum是使用RPM软件包管理器的Linux操作系统的免费开放源代码命令行软件包管理应用程序。 Yum是rpm的前端工具&#xff0c;可自动解决软件包的依赖性。…

鸿蒙dnf为什么一直连接服务器,DNF组队崩溃内存占用高怎么办 附带详细解决办法...

DNF很多小伙伴都会遇到组队崩溃的情况&#xff0c;这样的事情一般是因为内存占用度太高产生的&#xff0c;很多玩家还不清楚怎么解决组队崩溃的情况&#xff0c;下面就来为大家详细的介绍一下攻略。 1.启动游戏就不要用wegame了&#xff0c;直接打开DNF的start文件&#xff0c;…

无盘服务器搬砖会封号吗,DNF工作室多开搬砖起号二天,16个帐号全被封,对于95版本严厉打击工作室你如果评价?...

“DNF这款游戏属于做了饿不死&#xff0c;不做又可惜的肉” 在90版本时&#xff0c;游戏工作室可谓一路横行&#xff0c;每个地图前都是好多重叠在一起的角色&#xff0c;都是工作室在起小号&#xff0c;而随着95版本的更新&#xff0c;TX势必打击了一批工作室&#xff0c;凡是…

dnf计算机配置检测,如何用DNF的方式来测试(卡爆)''你的电脑''

原标题&#xff1a;如何用DNF的方式来测试(卡爆)你的电脑 如何用DNF的方式来测试你的电脑配置&#xff0c;废话不多说我们直接进入正题&#xff0c;电脑不好的玩家就别皮辣 既然是测试&#xff0c;肯定要把配置拉满 基础设置拉满后 步骤一&#xff1a; 测试对象首选为&#xff…