活动对象的使用

来源:互联网 发布:中小企业网络构建 编辑:程序博客网 时间:2024/04/30 00:19

*活动对象的典型用法:在某个应用中处理一些事件(如按键事件、屏幕更新等),一般用于在某个单一线程中实现非抢先式多任务。一般线程中都装有一个活动调度器,在这种情况下,程序员可以立即使用活动对象。但是在可执行程序(.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被启动时,如果并不存在任何等待中的未完成请求,这个线程将被永远挂起。

原创粉丝点击