被动对象就是一般情况下在那儿放着不会动,等待着别的执行线程调用,然后才会执行。主动对象一般自己包含执行线程,可以主动的执行代码。
1.主动对象是基于ACE_Task类的,它提供执行线程的。
2.当某些要执行的代码想被执行时,要放入某个队列,然后执行线程发现队列不空时就从这个队列里面取出这个队列中的对象,然后执行。这个队列就是ACE_Activation_Queue。
3.放在ACE_Activation_Queue中的对象被称为方法对象,这些对象都是继承于ACE_Method_Object,ACE_Method_Object提供了一个名字为call的虚函数(它只有三个函数,另外两个是一个构造和一个析构),实现自己的方法对象的call函数,然后可以在主动对象的svc函数(继承自ACE_Task类)中调用。
4.若要得到异步操作的结果,还需要ACE_Future对象,当异步执行完毕后,执行线程会设置该对象,如果还没有设置之前就想取得它里面的结果,则会阻塞,直到被设置为止。
所以,它的流程就是这样的:
(1) 创建一个Active Object对象,然后调用它的open函数(在open中调用activate,接着svc会被调用)。
(2) 在主动对象的里面循环调用ACE_Activation_Queue的dequeue()函数,如果ACE_Activation_Queue中没有方法对象,则会阻塞。
(3) 某个时候如果在ACE_Activation_Queue中存在方法对象,则该函数就会被顺利执行通过,并且它返回方法对象的指针,然后就可以调用这个方法对象的call函数。
这样,这个方法对象就会被顺利执行了。
在使用主动对象的时候,它也就是将某个方法对象初始化之后,放入ACE_Activation_Queue中,然后其它的事情就由上面的步骤来完成了。