彻底理解 Symbian 活动对象
2010-08-24 05:50:00 来源:WEB开发网Symbian编程总结-基础篇-活动对象正解(3)-活动对象的工作原理
我们已经知道如何创建和使用活动对象,大家对活动对象的创建、使用都有了一定的了解。在这一节里我将深入活动对象机制,分为“活动对象的工作流程”、“信号迷失错误”两个部分,为大家剖析活动对象的工作原理。
一、活动对象工作流程
首先我们用时序图来说明一下应用程序、活动对象、活动调度器及异步函数服务器之间创建及调用的流程:
下面我们针对每一个步骤结合代码(点击此处下载代码)进行说明:
1、创建并安装活动调度器:
CActiveScheduler* scheduler = new (ELeave) CActiveScheduler();
CleanupStack::PushL(scheduler);
CActiveScheduler::Install(scheduler);
如果创建了一个基于GUI应用程序框架的应用程序,框架已经为我们创建并且安装了活动调度器,我们可以直接使用CActiveScheduler的一系列方法。
2、创建活动对象
iMyAO = CMyActiveObject::NewL(*console);
此处创建的CMyActiveObject类是继承自CActive类的活动对象。
3、将活动对象添加到活动调度器中
void CMyActiveObject::ConstructL()
{
....
CActiveScheduler::Add( this); // Add to scheduler
}
可以看到,活动对象在通过“二阶段构造”创建时就已经将自己的指针添加到了活动调度器中。
4、StartL
StartL为应用程序请求活动对象调用异步函数的方法,此处用户可以根据自身需求对此方法重新命名:
void CMyActiveObject::StartL(TTimeIntervalMicroSeconds32 aDelay)
{
Cancel(); // 取消异步函数请求
iStatus = KRequestPending;
iTimer.After(iStatus, aDelay); // 在此处调用异步函数
SetActive(); // 将成员变量iActive = ETrue
}
因为不能保证用户在等待异步函数调用完毕返回的时候不重新调用StartL方法,所以在StartL方法的入口点首先调用Cancel()方法取消异步请求,否则可能会发生臭名远扬的“信号迷失”错误。
更多精彩
赞助商链接