[ACE程序员教程笔记]将同步方法转换为异步方法

来源:互联网 发布:adobe 软件 ico图标 编辑:程序博客网 时间:2024/05/29 16:39

对于比较耗时的处理(如IO操作),如果采用同步的调用方式,程序则会阻塞在当前调用的函数上,无法进行其它的操作,造成时间浪费,ACE提供了方法对象(ACE_Method_Object),可以实现将同步方法转换为异步方法的机制,下文中将以打印服务为例介绍如何将同步方法转换为异步调用的方法。

此方案采用了多线程处理的方式,将原来的类方法作为一个方法对象(ACE_Method_Object),每一次函数的调用都会创建一个方法对象,之后会将此方法对象加入到活动队列(activation queue),活动对象(ACE_Task)的服务函数中从队列中取出方法对象,并执行函数调用。

 

下面为日志类,主要包含Say和SayImpl两个函数,一个函数是供用户程序使用,另一个是供方法对象使用。

在实现代码中可以看到,每一次的函数调用都会创建一个MO对象,并将其压入队列;SayImpl模拟IO耗时操作。

方法对象是对Say的对象化,实现打印字符串的操作。每一个方法对应一个方法类

方法对象类的关键为call方法的实现,通过此方法可以调用Logger对象相关的函数

测试程序代码,针对pLogger对象执行100此函数调用,从其输出日志可以看出:每一次的函数调用,SayMO对象会被调用一次,调用完成之后会自动调用销毁函数;主程序线程与调用函数分别位于不同的线程中。