Symbian 活动对象彻底理解.docVIP

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Symbian 活动对象彻底理解 收藏 Symbian编程总结-基础篇-活动对象正解(1)-理解活动对象 Symbian OS中的活动对象的使用无疑是最基础的、最频繁的、最重要的。什么是活动对象呢? 大家学习一个新的事物时,总是会将这个新的事物与自己认知的事物相比较,从而达到快速学习的目的。我开始学习Symbian的时候,我查看很多 Symbian书籍、网上很多Symbian教程都将活动对象与多线程联系到一起,我也总是会把活动对象想象成一个线程。然而,经过了更深入的接触,我发现并不像我想象的那样。 现在,我在此向你保证:活动对象和多线程没有任何关系!不要拿平时做多线程的思想去理解活动对象! 活动对象可以按照以下步骤这么理解: Symbian OS中提供了很多异步函数,这些异步函数大多部分都是基于“服务器-客户端”架构的。这里与win32 api中的函数有很大的不同。如: win32中,CSocket::Receive(是recv而不是WSARecv)为同步函数,线程阻塞在Receive处,直到套接字接收到了网络流才返回。 Symbian OS也有类似的函数,RSocket::Receive,但是此函数是一个异步函数,线程不会阻塞在Receive处而会继续执行。 如何区分Symbian中的函数哪些是同步的哪些是异步的?很简单:看函数内是否包含类型为TRequestStatus的形参,如果有则函数为异步函数。如RSocket::Receive的函数原型为: IMPORT_C void Recv(TDes8 aDesc, TUint flags, TRequestStatus aStatus);参数aStatus为一个状态位,初始值为ERequestPending(值为1),它意味着用户请求的操作是否执行完毕。如:我们调用异步函数RSocket::Receive请求接收网络流,Receive函数会直接返回。当“接收”网络流的过程完毕后,aStatus会变为 EActive,所以我们只要监视aStatus是否不为ERequestPending就可以知道“接收”是否完成了。 我们可以使用以下伪代码完成以上所述操作: TRequestStatus status(KRequestPending);RSocket::Receive(aDesc, flags, status);for (;;) { if (status != KRequestPending) break; }// 此处我们已经通过RSocket::Receive完成了类似CSocket::Receive的同步的工作Symbian OS不建议我们使用以上方法,它建议我们使用异步方法,而不要使用我们这种方法去强制同步,活动对象就是帮我们做这件事情。活动对象体系帮我们监视aStatus的值,只要aStatus != ERequestPending,他就会以事件的方式通知我们,告诉我们“Socket已经接收完毕,你可以去取数据了!”,活动对象就是干这事的。 总结一下:系统中有一个“活动调度器”,我们建立一个“活动对象ao1”,将该对象与某个系统中的异步函数绑定,然后将该活动对象注册到“活动调度器”中,“活动调度器”会等待异步函数返回的“完成”消息。收到完成消息后,调度器遍历所注册的活动对象,如果发现status != KRequestPending则找到该status对应的“活动对象ao1”,调用其中的RunL方法,以事件的方式告知我们异步函数已经执行完成。 Symbian编程总结-基础篇-活动对象正解(2)-使用活动对象 我们已经大致了解了活动对象的基本概念,要使用活动对象机制,需要用到活动对象、活动调度器、异步函数。我们想使用异步函数,要按照应用程序-活动对象-活动调度器-异步函数的流程来使用。接下来我们开始进入实战,使用活动对象。 一、创建活动调度器 我们知道,活动调度器是应用程序和异步函数之间的桥梁,应用程序使用活动对象通过活动调度器去截获异步函数的返回“完成”消息,并以事件的方式通知应用程序。 使用Carbide C++ 1.3,通过模板向导生成的控制台程序自动为我们生成了创建活动调度器的代码: CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); CActiveScheduler::Install(scheduler);CActiveScheduler::Install()方法调用以后,内部代码就会将scheduler指针赋值给CActiveScheduler类内部的静态指针,后面的代码就可以方便的使用CActiveScheduler类的静态方法,如: IMPO

文档评论(0)

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

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

1亿VIP精品文档

相关文档