1、 与多线程的区别
多线程是抢占式任务处理,活动对象机制是协作式任务处理
2、 需要理解的概念
异步服务、活动对象规划器 AS ( Active Scheduler )、活动对象 AO ( Active Object )、信号量
异步服务 :一般在单独的进程(肯定是单独的线程),采用 client-server 机制提供服务。
AO : 封装了异步服务的请求,以及请求完成时 AS 会调用的处理函数 RunL 。发出异步服务后需要调用 SetActive 改变 iActive 标志 (置 true ) , 服务请求完成发出信号时会改变 AO 的 iStatus ,不再是 KrequstPending.
AS : 接收到信号后,结束循环等待查找 iActive 标志位为 true 、 iStatus 不为 KrequstPending 的服务请求完成的活动对象,重置 iActive 为 false, 调用其 RunL() 函数 . 当没有符合条件的时循环再次等待。
3、 AS
一般每次线程系统都会实现活动规划器,但控制台程序和 DLL 需程序员自己实现,先 new 再 install , start,stop
4、 AO
继承 CActive 虚基类,实现三个虚函数 RunL(), RunError(), DoCancel()
取消 AO 时调用 Cancel , Cancel 会调用 Docancel.
实现一个异步请求的函数,在发出异步请求后,调用 SetActive()
5、 常见错误
忘记调用 CActiveScheduler::Add() ,把AO 添加到AS 的活动对象列表
发出异步请求后忘了调用SetActive()