利用ACE实现主动对象模式,主动对象派生于ACE_Task,在任务线程内执行异步方法,每个异步方法需封装成派生自ACE_Method_Object的类,而ACE_Activation_Queue作为异步方法类对象的队列,ACE_Future对象用来指定异步对象操作的结果.下面继续练练自己的笨手了:

//异步处理的方法封装.需从ACE_Method_Object派生,并实现call方法
class  CAsyncCount : public  ACE_Method_Object
{
private:
    int  m_nMax;
    ACE_Future<int>  m_futureRet;
public: 
    CAsyncCount( int nMax, ACE_Future<int> futureRet ) 
    {
        m_nMax         =  nMax;
        m_futureRet   =  futureRet;
    }

virtual int call ( ) 
    {
        ACE_Time_Value tmWait( 0, 10000 );
        int  nSum = 0;
        for ( int nIndex = 1; nIndex <= m_nMax; nSum += nIndex,nIndex++ )
        {
            //每次执行等待10ms
            ACE_OS::sleep( tmWait );
        }
        //将结果设置到ACE_Future对象
        this->m_futureRet.set( nSum );

return -1;
    }
};

//主动对象
class  CTaskDemo : public ACE_Task<ACE_MT_SYNCH>
{
private:
    //保存异步任务队列
    ACE_Activation_Queue  m_activeQueue;

public:
    virtual int open (void *args = 0)
    {
        //创建一个线程
        this->activate( THR_NEW_LWP, 1 );
        return 0;
    }
    virtual int close (u_long flags = 0)
    {
        if ( ACE_OS::thr_equal ( ACE_Thread::self (),    this->last_thread () ) )
        {
            //释放对象
            delete this;
        }

return 0;
    }
    virtual int svc (void)
    {
        while ( true )
        {
            //用智能指针方便自动释放指针对象
            CAutoPtr<ACE_Method_Object>  spMethodObj( m_activeQueue.dequeue() );

//约定的退出机制,若call返回-1则推出
            if( -1 == spMethodObj->call() )
                break;
        }

return 0;
    }

public:
    ACE_Future<int>  AsyncCount( int nMax )
    {
        ACE_Future<int>  futureRet;
        //添加异步任务到队列
        this->m_activeQueue.enqueue( new CAsyncCount( nMax, futureRet ) );
        return futureRet;
    }
};

调用示例:

        CTaskDemo  *pTask = new CTaskDemo;
        pTask->open( );

//调用异步方法
        ACE_Future<int>  futureRet = pTask->AsyncCount( 100 );

do 
        {
            AtlTrace( _T("No Complete Yet\n") );
        } while( !futureRet.ready() );  //等待异步方法执行完
        
        int nSum( 0 );
        futureRet.get( nSum );  //获取执行结果
        AtlTrace( _T("The Result is %d\n"), nSum );

ACE_Thread_Manager::instance()->wait();

转载于:https://www.cnblogs.com/fangkm/archive/2009/06/24/1510009.html

ACE主动对象模式学习相关推荐

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

    主动对象模式用于降低方法执行和方法调用之间的耦合.该模式描述了另外一种更为透明的任务间通信方法. 传统上,所有的对象都是被动的代码段,对象中的代码是在对它发出方法调用的线程中执行的,当方法被调用时,调 ...

  2. java主动对象模式_POCO的主动对象

    摘自: http://pocoproject.org/docs/00100-GuidedTour.html Active object is an object that has methods ex ...

  3. ACE网络编程模式比较

    ACE将网络编程进行了模式化,以便你不必每次都重复相同的代码. 网络编程需要处理的事情多括中断,并发,多线程等,程序格式相对固定,但是健壮的网络程序则相对复杂.为了处理这些情形,ACE内建了几个网络编 ...

  4. junit5_JUnit 5和Selenium –使用Selenium内置的`PageFactory`实现页面对象模式

    junit5 Selenium是一组支持浏览器自动化的工具和库,主要用于Web应用程序测试. Selenium的组件之一是Selenium WebDriver,它提供客户端库,JSON有线协议(与浏览 ...

  5. 企业应用架构模式学习笔记

    1.概述 2.分层 表现逻辑处理用户与软件间的交互.表现层的主要职责是向用户显示信息并把从用户那里获取的信息解释成领域层或数据源层上的各种动作. 数据源逻辑主要关注与其他系统的交互,这些系统将代表应用 ...

  6. 设计模式学习之代理模式学习(一)

    设计模式学习之代理模式学习(一) 关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一 ...

  7. idea内置junit5_JUnit 5和Selenium –使用Selenium内置的`PageFactory`实现页面对象模式

    idea内置junit5 Selenium是一组支持浏览器自动化的工具和库,主要用于Web应用程序测试. Selenium的组件之一是Selenium WebDriver,它提供客户端库,JSON有线 ...

  8. JUnit 5和Selenium –使用Selenium内置的`PageFactory`实现页面对象模式

    Selenium是一组支持浏览器自动化的工具和库,主要用于Web应用程序测试. Selenium的组件之一是Selenium WebDriver,它提供客户端库,JSON有线协议(与浏览器驱动程序进行 ...

  9. php7 空对象,PHP设计模式之空对象模式(Null Object)代码实例大全(26)

    目的 空对象模式不属于 GoF 设计模式,但是它作为一种经常出现的套路足以被视为设计模式.它具有如下优点: 客户端代码简单 可以减少报空指针异常的几率 测试用例不需要考虑太多条件 返回一个对象或 nu ...

最新文章

  1. [蓝桥] 基础练习 回文数
  2. “亚信科技杯”南邮第七届大学生程序设计竞赛之网络预赛 (K L题解)
  3. Redis的Errorlog或者启动日志(错误日志)的配置
  4. centos7上systemd详解
  5. C#中的thread和task之 Thread ThreadPool
  6. 华为交换机VRP用户界面配置及Telnet登录实验
  7. 微软面试题:写程序找出二叉树的深度
  8. 【C++编程技巧】函数多个返回值
  9. Atitit.基于dsl的methodinvoker
  10. 【UVM芯片漫游指南_000】总目录(下)——UVM目录
  11. 用python手把手教你玩跳一跳小游戏,直接打出高分
  12. DSI3协议 CRM模式通信讲解
  13. 我的世界右边显示什么服务器,我的世界MC的服务器是什么意思
  14. HP iLO There are pending changes that may not take effect until ILO is reset
  15. 【RT-Thread 开源作品秀】时光空间立方
  16. 【二分图匹配】【CSTC2000】丘比特的烦恼
  17. ros入门--中科院软件所ros学习笔记
  18. 358. K 距离间隔重排字符串 排序
  19. weblogic-cve_2020_2883漏洞复现
  20. 如何在Python中定义变量

热门文章

  1. 如何理解DT将是未来IT的转型之路?
  2. 使用ZipCodeValidatorDomainType验证不同国家的邮编
  3. 浙江农林大学有计算机专业,浙江农林大学计算机科学与技术专业在职研究生
  4. 两个单片机iic通讯程序_PIC单片机之DS1302时钟
  5. python画聚类图_python绘制的聚类图Python的局部变量和全局变量使用解惑
  6. axios重新调用失败的ajax_Vue之axios实现ajax数据请求
  7. c获取当前程序的路径_漏洞挖掘|使用AFL Fuzzing网络程序
  8. hnu 暑期实训之挖掘机技术哪家强
  9. Bootstrap 表单
  10. 《南溪的python灵隐笔记》——有趣的Munch字典库