`
totoxian
  • 浏览: 1074154 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

深入探索Symbian活动对象开发

阅读更多

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++ 手机应用开发(第一卷,中文版).pdf

    “Symbian OS C++ 手机应用开发(第一卷,中文版)”这本书不仅为初学者提供了系统的学习路径,也为有一定基础的开发者提供了深入探索Symbian OS开发领域的宝贵资源。通过学习本书,读者将能够全面掌握Symbian C++...

    Symbian OS课件(10)

    《Symbian OS课件(10)》——探索Symbian OS中的活动对象 在移动操作系统领域,Symbian OS以其高效、安全和可扩展性而闻名,尤其是在早期智能手机市场占据主导地位。本课件重点讲解的是Symbian OS中的核心概念之一:...

    基于Carbide.c++的Symbian OS 9.1开发环境搭建

    接下来,你可以深入学习Symbian编程,探索更多高级特性,如线程管理、网络通信、数据库操作等,开发出自己的Symbian应用。记住,实践是检验真理的唯一标准,只有不断地尝试和调试,才能真正掌握Symbian开发技巧。在...

    symbian开发经验

    对于想要深入了解Symbian开发的初学者来说,以下是一些关键的知识点: 1. **Symbian系统架构**:Symbian是一个微内核系统,由实时操作系统内核、系统服务、中间件和应用程序四部分组成。其核心设计目标是高效利用...

    Symbian OS C++手机应用开发(第3卷)

    7. **系统服务与API**:探索Symbian提供的各种服务,如通信、多媒体、位置感知、蓝牙、PIM(个人信息管理)等功能的API调用。 8. **事件驱动编程**:理解Symbian OS中的事件循环和消息处理机制,以及如何编写响应...

    Symbian小程序,学习资料

    Symbian平台上的小程序开发,对于当时的开发者来说,是探索移动应用创新的重要途径。这份学习资料将带你深入理解Symbian小程序的开发过程,提升你的技能水平。 一、Symbian系统概述 Symbian操作系统是由Symbian公司...

    Andriod开发入门及深入

    ### Android开发入门及深入知识点详解 #### 一、Android发展背景与重要性 - **背景简介**:2007年11月5日,Google联合多家手机制造商、硬件供应商等组建了“开放手持设备联盟”(Open Handset Alliance),共同...

    塞班贝拉游戏---贪吃蛇源码

    本文将深入探讨使用Java编程技术在塞班系统上实现贪吃蛇游戏的过程,旨在帮助读者理解游戏开发的基本原理和技巧。 首先,我们要明确的是,塞班系统(Symbian)是早期智能手机广泛采用的操作系统,尤其在诺基亚手机...

    Symbian学习基础PPt

    C++编程在Symbian中具有较高的性能和灵活性,但也需要对操作系统有深入的理解,以便有效管理内存和线程。 **Symbian学习基础PPT** 提到"Symbian学习基础PPT",这可能是一个包含Symbian操作系统基础知识的教学资料...

    symbian 人物移动

    本篇文章将深入探讨如何在Symbian平台上,使用Carbide C++进行游戏开发,特别是关于人物移动的实现,这对于理解Symbian的架构和继承机制至关重要。 首先,我们要明白Symbian系统的核心在于其面向对象的C++库,这...

    《Series 60应用程序开发》代码

    1. **Symbian C++开发**:Symbian C++是Series 60平台的主要开发语言,具有严格的内存管理和面向对象特性。开发者需要理解Symbian的事件驱动模型,以及如何使用EPOC(Embedded Operating System)的API来操作文件...

    EMCC.rar_emcc

    Symbian采用的是基于对象的内存管理,每个对象都有自己的生命周期,开发者需要精确地控制对象的创建、使用和销毁,以避免内存泄漏。EMCC的引入,使得开发者可以通过系统层面的机制来缓解内存压力,但同时也需要...

    StatusPane.rar_s60 status pane_symbian

    在Symbian操作系统中,Status Pane(状态栏)是一个至关重要的组件,它位于手机屏幕的顶部,显示着各种系统信息和通知。这个"StatusPane.rar_s60 ...对于那些想要深入Symbian开发的人来说,这是一个有价值的参考资料。

    Developing.Series.60.Applications 例子源码

    这个资源对于想要深入学习Symbian操作系统上Series 60平台应用开发的程序员来说非常宝贵。 【描述】提到的书籍"Addison.Wesley.Developing.Series.60.Applications.A.Guide.for.Symbian.OS.C.Developers"是Symbian...

    S60_CPP_basic.rar_s60

    《S60 C++入门教程》是一份专为想要学习Symbian S60平台C++编程的初学者准备的详细指南。...随着对S60系统深入理解,开发者可以进一步探索更高级的主题,如服务编程、多媒体支持以及与其他设备和服务的集成。

    经典的S60飞机游戏源码 可以下载

    这款源码对于开发者来说,是一个宝贵的资源,可以深入了解Symbian系统下游戏开发的技术细节。 在描述中,提到了这个源码是用Java语言编写的。Java是一种广泛使用的面向对象的编程语言,因其跨平台的特性,常被用于...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    鉴于市场上用户的手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合的方式进行移动端Web系统的设计研发工作...

    S60_Platform_How_to_Develop_Unit_Tests_v1_0_en.pdf

    - 探索更多关于Symbian C++开发资源和技术文档。 - 参考书籍和在线课程,了解单元测试最佳实践。 #### 7. 参考资料 - Symbian官方文档。 - EUnit框架官方文档。 - S60平台文档。 #### 附录A: TestSource.cpp 此...

Global site tag (gtag.js) - Google Analytics