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塞班程序基本架构 活动对象的例子
Symbian 活动对象,Symbian手机活动对像介绍.
symbian 活动对象一个很好的使用范例
symbian官方资料,详细讲解了有关活动对象的框架,活动对象的常见问题,讲解了CActive类,并举例说明了活动对象的使用
Symbian OS 之活动对象
活动对象3 张锦锋Symbian讲座 活动对象3 张锦锋Symbian讲座 活动对象3 张锦锋Symbian讲座
活动对象2 张锦锋Symbian讲座 活动对象2 张锦锋Symbian讲座 活动对象2 张锦锋Symbian讲座
其实我也是symbian初学者,由于感觉这个部分比较难理解所以经过琢磨改写出了这个程序,也算是我对活动对象实现多任务程序的理解 ,希望能够帮助学习symbian的广大初学者朋友们.也希望关注的朋友们批评、指点。
SymbianOS概述 SymbianSDK及其开发环境 Symbian软件开发
活动对象活动对象活动对象活动对象活动对象活动对象活动对象活动对象活动对象活动对象活动对象活动对象
共4个rar,作者:何伟//杨宗德//张兵,本书主要介绍基于Symbian平台的控制台应用程序和GUI应用程序的开发,内容涵盖开发平台的搭建、内存管理、描述符、动态数组、文件管理、活动对象、GUI应用程序开发、多媒体程序...
symbian Socket 结合活动对象 异步函数 详细 深入讲解
线程通信比活动对象间通信缓慢且困难很多,活动对象是在同一个线程中运行,所以它们不需要任何方法就可以共享数据.
Series 60是在Symbian OS下进行智能手机应用程序开发的主要平台,它拥有广大的用户群。本书是诺基亚与EMCC公司共同推出的一本Series 60开发的权威参考书,为Symbian OS下的C++编程提供全面指导。. 全书共13章,循序...
2. Symbian开发入门第一步 3. S60v1.2 N-GAGE QD 开发环境搭建(VC6版) 4. S60十大优秀软件 5. S60 系统手机类型及所用操作系统 6. S60 和 Symbian OS 的关系 7. S40与S60的区别 8. 诺基亚S60手机隐藏代码 9...
Symbian编程总结-基础篇-活动对象正解(1) Symbian编程总结-基础篇-活动对象正解(2)-使用活动对象 Symbian编程总结-基础篇-活动对象正解(3)-活动对象的工作原理 Symbian编程总结-基础篇-活动对象正解(4)-异步...
symbian系统开发教程.....symbian系统开发教程
symbian塞班软件开发工程师培训班实施方案.doc
全书共分为21章,分别介绍了Symbian OS中的类命名约定、异常退出、清除栈、两段构造、描述符、良好的描述符风格、动态的数组与缓冲区、使用活动对象的事件驱动多任务、活动对象、Symbian OS的线程与进程、客户/...
Symbian 多任务下载的活动对象实现,不是采用多线程。