ACE的主动对象模式的实现

对分布式系统设计来说,ACE提供的主动对象模式是让我们在系统框架构建的时候,回归到传统的单线程编程思维。你可能要问,既然有主动对象,那必然有被动对象,没有错,确实有被动对象,那到底什么是主动对象?什么又是被动对象呢?

被动对象:

假如我们要给一个客户端提供一个方法,计算两个数之和。我们一般定义一个对象,然后实现具体的加法运算操作,客户端在调用的时候,首先实例化我们这个对象,然后再执行这个方法。此时,这个对象的加法运算操作的执行和客户端的调用线程在一个线程中完成。这是标准的单线程执行顺序。我们把这种对象叫做被动对象,被动对象所提供的方法叫做被动对象的方法。

主动对象:

同理,假如我们要给一个客户端提供一个方法,计算两个数之和。同样我们如果实现了一个主动对象,同时给这个主动对象增加一个计算两个数之和的主动对象方法,那么当客户端调用这个主动对象所提供的方法的时候,这个对象的加法运算操作的执行和客户端的调用线程就不在一个线程中完成。而是在另外的一个线程中执行。我们把这种对象叫做主动对象,主动对象所提供的方法叫做主动对象的方法。

// ActiveObject.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include "ace/OS_NS_unistd.h"
#include "ace/Activation_Queue.h"
#include "ace/Method_Request.h"
#include "ace/Task.h"
#include "ace/Future.h"
#include "ace/Auto_Ptr.h" class CAdd;
class CAdd_MethordRequest;
class CScheduler;
class CAgent; //第一步: 实现一个被动对象
class CAdd
{
public:
CAdd(int a1, int a2)
{
m_a1 = a1;
m_a2 = a2;
}
~CAdd(void)
{
}
public:
int calculate_add()
{
return m_a1 + m_a2;
} int geta1()
{
return m_a1;
} int geta2()
{
return m_a2;
}
private:
int m_a1;
int m_a2;
}; //第二步:从 ACE_Method_Request 继承一个对象,实现他的虚函数 void call()
class CAdd_MethordRequest : public ACE_Method_Request
{
public:
CAdd_MethordRequest(CAdd add, ACE_Future<int>& retvalue)
{
m_padd = new CAdd(add.geta1(), add.geta2());
returnVal_ = retvalue;
}
~CAdd_MethordRequest(void)
{
delete m_padd;
}
public:
virtual int call(void)
{
this->returnVal_.set(this->m_padd->calculate_add());
return 0;
}
private:
CAdd *m_padd;
ACE_Future<int> returnVal_;
}; //第三步,实现一个task, 其中定义一个ACE_Activation_Queue对象
class CScheduler : public ACE_Task_Base
{
public:
CScheduler(void)
{
this->activate();
} ~CScheduler(void)
{
} public:
virtual int svc (void)
{
while (1)
{
auto_ptr<ACE_Method_Request> request (this->activation_queue_.dequeue());
if (request->call() == -1) break;
}
return 0;
}
int enqueue (ACE_Method_Request *request)
{
return this->activation_queue_.enqueue (request);
} private:
ACE_Activation_Queue activation_queue_;
}; //第四步,实现一个主动对象
class Agent
{
public:
Agent()
{
}
~Agent(void)
{
}
public:
//这个才是真正的主动对象的方法,这个方法才是客户端调用的真正的方法
ACE_Future<int> calculate_add(int a1, int a2)
{
ACE_Future<int> result;
CAdd add(a1, a2);
this->scheduler_.enqueue(new CAdd_MethordRequest(add, result));
return result;
}
private:
CScheduler scheduler_;
}; int main(int argc, char* argv[])
{
ACE_Future<int> results[10];
//定义主动对象
Agent agent;
for (int i = 0 ; i < 10; i++)
{
//调用主动对象的方法
results[i] = agent.calculate_add(i, i);
} //模拟客户端去做其他事情了
ACE_OS::sleep (5); //这个事检测调用了主动对象方法的返回值,在时间情况中在其他线程中。
for (int j = 0; j < 10; j++)
{
int result = 0;
results[j].get(result);
ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("calculate result: %d\n"), result));
} ACE_Thread_Manager::instance ()->wait (); return 0;
}

ACE 主动对象模式的按部就班的实现方法的更多相关文章

  1. ACE主动对象模式

    ACE主动对象模式 ACE主动对象模式解决的核心问题是,异步调用及线程context的切换.ACE主动对象的实现侧重于类代码段的并发访问,这种访问模式仅适合短小的处理流程,比如socket的accep ...

  2. ACE主动对象模式(2)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/12/590153.html 我们简单的介绍了一下ACE主动对象实现方式,同时提出了两个问题: ...

  3. ACE主动对象模式(1)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/11/589168.html 主动对象模式用于降低方法执行和方法调用之间的耦合.该模式描述了另外 ...

  4. 设计模式- 主动对象(Active Object)

    译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...

  5. 空对象模式(Null Object Pattern)

    空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...

  6. ASP.NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式

    鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...

  7. 【设计模式 - 21】之空对象模式(Null Object)

    1      模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...

  8. 设计模式:空对象模式(Null Object Pattern)

    设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...

  9. C# 设计模式之空对象模式

    最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象 ...

随机推荐

  1. 单例模式(Singleton)Holder

    public class Singleton { /** * 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 * 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 */ ...

  2. IOS上怎样画出1像素的线

    #define SINGLE_LINE_WIDTH (/[UIScreen mainScreen].scale) #define SINGLE_LINE_ADJUST_OFFSET ((/[UIScr ...

  3. ORACLE常用数据库类型(转)

    oracle常用数据类型 1.Char 定长格式字符串,在数据库中存储时不足位数填补空格,它的声明方式如下CHAR(L),L为字符串长度,缺省为1,作为变量最大32767个字符,作为数据存储在ORAC ...

  4. NYOJ 914 Yougth的最大化

    Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描写叙述 Yougth如今有n个物品的重量和价值各自是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价 ...

  5. [Cocos2d-x]随机数

    Cocos2d-x为我们提供了生成随机数的宏:CCRANDOM_0_1() 具体定义如下: /** @def CCRANDOM_0_1 returns a random float between 0 ...

  6. cocostudio——js 3 final控件事件

    近期试用了下cocos ide,然后引擎用的cocos2dx js 3 final,须要build runtime一下,以下是cocos studio相关的一些事件: 加入事件侦听: // butto ...

  7. Linux内核升级

    一.测试环境 CentOS6.5 X86 64位 内核版本为 2.6.32 VM 10.07 二.编译内核版本 2.1.kernel 3.2.71 2.2.kernel 3.4.108 2.3.ker ...

  8. Matlab---串口操作---数据採集篇

    matlab功能强大,串口操作也非常easy.相信看过下面两个实验你就能掌握咯! 開始吧! 实验1: 从电脑COM2口读取数据.并将数据保存在TXT文件里,方便数据分析,以下是M脚本: %名 称:Ma ...

  9. GitHub基本操作(转)

    一.上传代码到仓库 步骤一:创建本地仓库,如下: 创建结果: 步骤二:发布自己创建的仓库,如下: 发布完显示如下: 步骤三:向自己发布仓库上传代码,如下: 首先将代码复制到本地仓库,如下: 复制完,显 ...

  10. Spring整合Jms学习(三)_MessageConverter介绍

    1.4     消息转换器MessageConverter MessageConverter的作用主要有双方面,一方面它能够把我们的非标准化Message对象转换成我们的目标Message对象,这主要 ...