ACE 主动对象模式的按部就班的实现方法
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 主动对象模式的按部就班的实现方法的更多相关文章
- ACE主动对象模式
ACE主动对象模式 ACE主动对象模式解决的核心问题是,异步调用及线程context的切换.ACE主动对象的实现侧重于类代码段的并发访问,这种访问模式仅适合短小的处理流程,比如socket的accep ...
- ACE主动对象模式(2)
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/12/590153.html 我们简单的介绍了一下ACE主动对象实现方式,同时提出了两个问题: ...
- ACE主动对象模式(1)
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/11/589168.html 主动对象模式用于降低方法执行和方法调用之间的耦合.该模式描述了另外 ...
- 设计模式- 主动对象(Active Object)
译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...
- 空对象模式(Null Object Pattern)
空对象模式:用一个空对象来取代null实例的检查,空对象实现一个不做任何动作的关系.(消除如if(Object == null) 这样的检查null实例代码) 例子: public abstract ...
- ASP.NET设计模式(一)、适配器模式、依赖注入依赖倒置、空对象模式
鸟随凤鸾,人伴贤良,得以共之,我之幸也.说的是鸟随着鸾凤可以飞的更高远,人和比自己境界高的相处,自己也会得到熏染进步. 一.概述 分享出来简单的心得,望探讨 依赖倒置 依赖注入 Adapter模式 N ...
- 【设计模式 - 21】之空对象模式(Null Object)
1 模式简介 在空对象模式中,一个空对象取代NULL对象的实例的检查.NULL对象不是检查空值,而是反映一个不做任何动作的关系.这样的NULL对象也可以在数据不可用的时候提供默认的行为. 在 ...
- 设计模式:空对象模式(Null Object Pattern)
设计模式:空对象模式(Null Object Pattern) 背景 群里聊到<ASP.NET设计模式>,这本书里有一个“Null Object Pattern”,大家就闲聊了一下这个模式 ...
- C# 设计模式之空对象模式
最近看了不少的书籍和视频等相关资料,决定自己边学习边写一下个人对设计模式的理解,如果有不对的请大家多多指正. 今天先说说我个人觉得最简单的设计模式 -- [空对象模式] 空对象模式可以减少客户端对对象 ...
随机推荐
- 怎样从ext3升级到ext4?
Ext4 文件系统提供了更佳的性能和可靠性,具有了更为丰富的功能,那么,怎样从ext3升级到ext4呢? 首先,我们须要保证系统支持ext4,一般来说,内核版本号在2.6.28及以上的版本号才支持ex ...
- leetcode第一刷_Sqrt(x)
这道题乍看下来很easy,实际上要注意的问题许多. 注意看给出来的函数的接口,返回的是int值,也就是计算结果是个近似值.如何求呢?难道是从2開始往上算?直到某个值正好接近x?当然不行,肯定超时了.再 ...
- 出现异常 child->m_pParent == 0
在cocos2d-x中,能够用CCNode类 自己new一个节点(或是用CCnode::node().create()),当将它作为其它若干item(如button项.sprite项.image项)的 ...
- 一int考虑什么类型的多少字节
一int表示的字节数? 问题是,我们经常得到的答案4. 但int究竟占多少个字节,却跟你的机器环境有关. As you can see, the typical data type sizes mat ...
- 创作gtk源码级vim帮助文档 tags
创作gtk源码级vim帮助文档 tags 缘由 那只有看到源码了.在linux源码上有个网站 http://lxr.linux.no /+trees, 可以很方面的查出相应版本的代码实现,gtk没有. ...
- Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客
Org-mode五分钟教程ZZZ - Kaka Abel的日志 - 网易博客 Org-mode五分钟教程ZZZ
- WiPlug_百度百科
WiPlug_百度百科 WiPlug
- Objective-C中经常使用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect
Objective-C中经常使用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect 1 NSRange NSRange 的原型为 typedef struct _N ...
- SVN无法修改以前提交日志的办法
一直用SVN作为代码备份,但是今天偶然发现SVN上不能修改意见提交的代码,于是乎开始谷歌了,最后发现只需要在该工程下的hooks目录下放入pre-revprop-change.bat文件即可. pre ...
- linux expect, spawn用法小记
linux expect, spawn用法小记_IT民工_百度空间 linux expect, spawn用法小记 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://sys ...