*活动对象的典型用法:在某个应用中处理一些事件(如按键事件、屏幕更新等),一般用于在某个单一线程中实现非抢先式多任务。一般线程中都装有一个活动调度器,在这种情况下,程序员可以立即使用活动对象。但是在可执行程序(.exe)中或创建自己的线程时,必须先安装AS,再使用AO.
AO的具体使用:
1、创建AO,并将其加入到AS中-----
MyActiveObject::MyActiveObject() : CActive(0) // 这里可以设置活动对象的优先级
{
// 把自己加入AS中
CActiveScheduler::Add(this);
}
2、在AO中实现具体的异步请求(如StartL())。AO将iStatus作为该异步请求的一个参数传递,该异步方法将iStatus变量设定为KRequestPending,以表示该AO正在等待某个请求的完成,并将请求消息发送给服务器端。然后,异步方式返回,并调用SetActive()方法激活该AO(该方法向AS指出:必须追踪这个活动对象的完成)。
3、服务器端完成请求后,将结果代码赋给iStats变量。
4、AS追踪被激活的AO,若AO的iStatus不为KRequestPending,就调用RunL()方法。
**RunL()方法为处理服务器端返回的异步请求结果。它也可重新发起一个异步请求(即调用StartL()方法)。
另:AO中必须实现继承自CActive的纯虚函数--DoCancel(),该方法为取消正在运行的异步请求。
ps:AO中必须有service provider作为其构造函数的参数。
AS的使用:
Symbian OS中的每个进程都有一个主线程,这个主线程为这个进程创建一些额外的线程。若用到了AO,就必须为这个线程实例化AS,才能启动它以便对AO进行调度。
在可执行程序(.exe)或自己创建的线程中使用AO,就必须
1、用一下方法创建并安装一个AS
CActiveScheduler* exampleScheduler = new (ELeave) CActiveScheduler;
CleanupStack::PushL( exampleScheduler );
CActiveScheduler::Install();
2、用方法CActiveScheduler::Start()来启动它
3、在最后,在一个AO中调用CActiveScheduler::Stop()来停止该AS。并释放它:CleanupStack::PopAndDestroy(exampleScheduler).
***当该AS被启动时,如果并不存在任何等待中的未完成请求,这个线程将被永远挂起。