Symbian_OS_之活动对象.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一、概述: Symbian OS是一个多任务的操作系统,那么为了实现多任务,同时使系统能够快速响应,高效的进行事件处理,并减轻应用程序员的工作负担(申请大多数耗时的操作(例如文件系统)由服务提供器来完成,服务提供器完成程序员提交的请求后,将会返回给程序员一个成功或失败的信号。), Symbian OS特意引入了活动对象的概念。 服务提供器API具有函数的异步和同步版本,供客户应用程序使用。所谓同步是指,客户提交请求后,处于等待状态,等待服务提供器返回成功或失败的信号后,然后在进行其他操作;所谓异步是指,请求完成,即返回信号之前,调用者也许会继续执行其他的处理,或者只是简单的等待。在这里的等待,也可以称为“阻塞”,信号就是一个事件,我们的代码就是事件驱动的。为了实现多任务,一般我们使用异步API。 一般操作系统为了实现多任务,往往使用多线程实现,当然,Symbian也是支持多线程的。但是,在同一个线程中运行的活动对象之间进行切换的代价要比线程上下文的切换代价低,这使得对于各种资源比较紧张的Symbian OS来说,使得活动对象更适合事件驱动多任务。 注意: (1)线程间上下文切换和同一线程的活动对象之间传递控制权,在速度上的差别可能会有10倍之差,另外,一个线程大约在内核中有4KB的空间开销,在用户空间上有8KB的用于程序栈的空间开销,而一个活动对象的开销可能只有几百字节,甚至更小。 (2)虽然在一个线程内的活动对象是非抢占式地协同运行的,但在Symbian中,它们所在的线程确是抢占式调度的。 ? 二、概念: 一个活动对象必须派生自基类CActive class CActive : public CBase { public: ?????? enum Tpriority { ?????? ?????? EPriorityIdle = -100; ?????? ?????? EPriorityLow = -20; ?????? ?????? EPriorityStandard = 0; ?????? ?????? EPriorityUserInput = 10; ?????? ?????? EPriorityHigh = 20; } public: ?????? IMPORT_C ~CActive (); ?????? IMPORT_C void Cancel ();//删除未完成请求的函数 ?????? …… ?????? IMPORT_C void SetPriority (TInt aPriority); ?????? Inline TBool IsActive () const; ?????? …… protected: ?????? IMPORT_C CActive (TInt aPriority); ?????? IMPORT_C void SetActive (); ?????? virtual void DoCancel () = 0;//两个纯虚函数,继承类必须实现它们 ?????? virtual void RunL () = 0;//处理函数 ?????? IMPORT_C virtual TInt RunError (TInt aError); public: ?????? TrequestStatus iStatus;//代表请求状态 ?????? ……. private: ?????? TBool iActive; ?????? ……. } 通过上面的CActive声明可以看出:活动对象和线程类似,构造时也会有一个优先级值来决定它们如何被调度,通常为活动对象提供一个标准优先级EPriorityStandard。当活动对象响应的异步服务完成时,就会产生一个事件。活动调度器会侦测到事件,并决定每个事件对应的是哪个活动对象,然后调用恰当的活动对象去处理事件。当活动对象处理事件时,直到事件处理函数返回到活动调度器,该对象都是无法被抢占的,也就是说,RunL()事件处理函数是一个原子操作。 在Symbian OS中,活动对象相互协作并顺序的实现多任务,也不需要对共享的资源进行同步保护。另外,因为活动对象在同一个线程中运行,所以可以更容易地共享内存和对象,尽管活动对象存在于同一线程,但它们仍然是各自独立运行的,这就好像同一个进程中的线程是独立运行的一样。 ? 三、关于活动对象基类CActive的几点说明: 参照上面CActive的声明 1、? 必须在发布请求时调用SetActive(),否则活动对象规划器在搜索已完成的活动对象时忽略它,从而导致错误。需要说明的是,在CActive这个基类中,并没有任何实际的函数用来发布异步请求,我们自己必须编写这种函数,通常取名为StartL()。 2、? ()是个纯虚函数,必须实

文档评论(0)

gangshou + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档