Author:孙东风
Date:04/02/2008
ActiveObject是Symbian中的一个重要概念,它是Symbian OS为了节省系统资源利用单线程来实现多任务异步处理的机制。
S60本身的Framwork也大量采用AO进行多任务的实现,例如我们可以在S60 EIKON Control based application中直接调用以下代码添加自身的AO到系统CActiveScheduler中。
void CActiveTest3NewClass::ConstructL()
{
User::LeaveIfError(iTimer.CreateLocal());// Initialize timer
CActiveScheduler::Add(this);// Add to scheduler
}
如果你有CustKit、DevKit或者BAK,那么跟踪Symbian程序的入口
GLDEF_C TInt E32Main()
{
return EikStart::RunApplication( NewApplication );
}
你会发现EikStart::RunApplication其实调用的就是CActiveScheduler::Start(),这个调用启动了一个CActiveScheduler并进入了CActiveScheduler的循环。而程序一旦进入了CActiveScheduler的循环后就不会跳出来,直到程序结束。
这一点很像Windows的消息循环机制:
while(getMessage(...))
{
TranslateMessage(...);
DispatchMessage(...);
}
CActiveScheduler维护着一个等待循环,这个等待循环用于接受所有活动对象发出的请求,然后交给相应的服务器程序进行处理。当请求得到响应后,服务器会产生一个事件,这个事件由RunL()函数处理,事件处理完后RunL()函数可以决定是继续发送下一个请求还是终止发出请求。
例如下面的程序就是RunL()处理后继续发送请求,从而让程序不断的循环:
void CActiveTest3NewClass::RunL() { ShowDialog(iCount++); SetActive();// Tell scheduler a request is active } |
当然上面这个循环太过于快速,有时候会出现"跳表"。那么可以采用一个RTimer进行时钟控制:
void CActiveTest3NewClass::RunL() { ShowDialog(iCount++);
//iTimer.After(iStatus, 1000000); // Set for 1 sec later SetActive();// Tell scheduler a request is active }
|
既然CActiveScheduler负责AO的调度,那么明白CActiveScheduler的调度原则就显得很重要,CActiveScheduler的调度原则分为下面两条:
①根据AO的优先级顺序对已经add进来的AO逐个检查。
CActiveScheduler有一张AO表,按优先级从大到小的顺序记录它所拥有的AO。然后根据每个AO的优先级决定谁先得到服务器的响应。
②判断当前遍历到的AO的IsActive()值和iStatus状态。
在IsActive()为ETrue并且iStatus != KRquestPending时,才会把AO的请求提交给服务器程序。在接收到服务器的响应后,再执行AO的RunL()方法。
其中TRequestStatus iStatus是抽象基类CActive的一个状态变量,它是TRequestStatus类的对象,封装了服务器返回时提供的状态或错误码。当发出请求时,活动对象将iStatus的引用传递到服务器,服务器将iStatus的值设为KRequestPedding而阻塞其它请求。当请求完成时,服务器将iStatus的值设为KErrNone。
下面是我写的一个AO的测试例子,实现了一个动画:
/* ============================================================================ Name : ActiveTest3NewClass.h Author : DongfengSun Version : 04/02/2008 Copyright : Your copyright notice Description : CActiveTest3NewClass declaration ============================================================================ */
#ifndef ACTIVETEST3NEWCLASS_H #define ACTIVETEST3NEWCLASS_H
#include <e32base.h>// For CActive, link against: euser.lib #include <e32std.h>// For RTimer, link against: euser.lib
class CActiveTest3NewClass : public CActive { public: CActiveTest3NewClass(); void ConstructL(); ~CActiveTest3NewClass();
public: // New functions void StartL(TTimeIntervalMicroSeconds32 aDelay); void ShowDialog(TInt aCount);
private: // From CActive void RunL(); void DoCancel();
private: enum TActiveTest3NewClassState { EUninitialized, EInitialized, EError };
private: TInt iState; RTimeriTimer; TIntiCount;
};
#endif
|
/* ============================================================================ Name : ActiveTest3NewClass.cpp Author : DongfengSun Version : 04/02/2008 Copyright : Your copyright notice Description : CActiveTest3NewClass implementation ============================================================================ */
#include "ActiveTest3NewClass.h" #include "aknnotewrappers.h"
CActiveTest3NewClass::CActiveTest3NewClass() : CActive(EPriorityStandard) { ConstructL(); }
void CActiveTest3NewClass::ConstructL() { User::LeaveIfError(iTimer.CreateLocal()); CActiveScheduler::Add(this); }
CActiveTest3NewClass::~CActiveTest3NewClass() { Cancel(); }
void CActiveTest3NewClass::DoCancel() { iTimer.Cancel(); }
void CActiveTest3NewClass::StartL(TTimeIntervalMicroSeconds32 aDelay) { Cancel(); iState = EUninitialized; iTimer.After(iStatus, aDelay); TRAPD(ERROR,SetActive()); TBuf<12> iBuf; iBuf.AppendNum(ERROR); CEikonEnv::Static()->InfoMsg(iBuf); }
void CActiveTest3NewClass::ShowDialog(TInt aCount) { TBuf<32> iBuf; iBuf.operator += _L("The index is :"); iBuf.AppendNum(aCount); CAknInformationNote* iInfoNote = new (ELeave) CAknInformationNote; iInfoNote->ExecuteLD(iBuf); }
void CActiveTest3NewClass::RunL() { if (iState == EUninitialized) { iState = EInitialized; } else if (iState != EError) { } ShowDialog(iCount++); iTimer.After(iStatus, 1000000); SetActive(); }
|
分享到:
相关推荐
“Symbian OS C++ 手机应用开发(第一卷,中文版)”这本书不仅为初学者提供了系统的学习路径,也为有一定基础的开发者提供了深入探索Symbian OS开发领域的宝贵资源。通过学习本书,读者将能够全面掌握Symbian C++...
《Symbian OS课件(10)》——探索Symbian OS中的活动对象 在移动操作系统领域,Symbian OS以其高效、安全和可扩展性而闻名,尤其是在早期智能手机市场占据主导地位。本课件重点讲解的是Symbian OS中的核心概念之一:...
接下来,你可以深入学习Symbian编程,探索更多高级特性,如线程管理、网络通信、数据库操作等,开发出自己的Symbian应用。记住,实践是检验真理的唯一标准,只有不断地尝试和调试,才能真正掌握Symbian开发技巧。在...
对于想要深入了解Symbian开发的初学者来说,以下是一些关键的知识点: 1. **Symbian系统架构**:Symbian是一个微内核系统,由实时操作系统内核、系统服务、中间件和应用程序四部分组成。其核心设计目标是高效利用...
7. **系统服务与API**:探索Symbian提供的各种服务,如通信、多媒体、位置感知、蓝牙、PIM(个人信息管理)等功能的API调用。 8. **事件驱动编程**:理解Symbian OS中的事件循环和消息处理机制,以及如何编写响应...
Symbian平台上的小程序开发,对于当时的开发者来说,是探索移动应用创新的重要途径。这份学习资料将带你深入理解Symbian小程序的开发过程,提升你的技能水平。 一、Symbian系统概述 Symbian操作系统是由Symbian公司...
### Android开发入门及深入知识点详解 #### 一、Android发展背景与重要性 - **背景简介**:2007年11月5日,Google联合多家手机制造商、硬件供应商等组建了“开放手持设备联盟”(Open Handset Alliance),共同...
本文将深入探讨使用Java编程技术在塞班系统上实现贪吃蛇游戏的过程,旨在帮助读者理解游戏开发的基本原理和技巧。 首先,我们要明确的是,塞班系统(Symbian)是早期智能手机广泛采用的操作系统,尤其在诺基亚手机...
C++编程在Symbian中具有较高的性能和灵活性,但也需要对操作系统有深入的理解,以便有效管理内存和线程。 **Symbian学习基础PPT** 提到"Symbian学习基础PPT",这可能是一个包含Symbian操作系统基础知识的教学资料...
本篇文章将深入探讨如何在Symbian平台上,使用Carbide C++进行游戏开发,特别是关于人物移动的实现,这对于理解Symbian的架构和继承机制至关重要。 首先,我们要明白Symbian系统的核心在于其面向对象的C++库,这...
1. **Symbian C++开发**:Symbian C++是Series 60平台的主要开发语言,具有严格的内存管理和面向对象特性。开发者需要理解Symbian的事件驱动模型,以及如何使用EPOC(Embedded Operating System)的API来操作文件...
Symbian采用的是基于对象的内存管理,每个对象都有自己的生命周期,开发者需要精确地控制对象的创建、使用和销毁,以避免内存泄漏。EMCC的引入,使得开发者可以通过系统层面的机制来缓解内存压力,但同时也需要...
在Symbian操作系统中,Status Pane(状态栏)是一个至关重要的组件,它位于手机屏幕的顶部,显示着各种系统信息和通知。这个"StatusPane.rar_s60 ...对于那些想要深入Symbian开发的人来说,这是一个有价值的参考资料。
这个资源对于想要深入学习Symbian操作系统上Series 60平台应用开发的程序员来说非常宝贵。 【描述】提到的书籍"Addison.Wesley.Developing.Series.60.Applications.A.Guide.for.Symbian.OS.C.Developers"是Symbian...
《S60 C++入门教程》是一份专为想要学习Symbian S60平台C++编程的初学者准备的详细指南。...随着对S60系统深入理解,开发者可以进一步探索更高级的主题,如服务编程、多媒体支持以及与其他设备和服务的集成。
这款源码对于开发者来说,是一个宝贵的资源,可以深入了解Symbian系统下游戏开发的技术细节。 在描述中,提到了这个源码是用Java语言编写的。Java是一种广泛使用的面向对象的编程语言,因其跨平台的特性,常被用于...
鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合的方式进行移动端Web系统的设计研发工作...
- 探索更多关于Symbian C++开发资源和技术文档。 - 参考书籍和在线课程,了解单元测试最佳实践。 #### 7. 参考资料 - Symbian官方文档。 - EUnit框架官方文档。 - S60平台文档。 #### 附录A: TestSource.cpp 此...