欢迎来到天天文库
浏览记录
ID:28818939
大小:58.50 KB
页数:12页
时间:2018-12-14
《symbian精彩活动对象彻底理解》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实用标准文案Symbian活动对象彻底理解收藏Symbian编程总结-基础篇-活动对象正解(1)-理解活动对象SymbianOS中的活动对象的使用无疑是最基础的、最频繁的、最重要的。什么是活动对象呢?大家学习一个新的事物时,总是会将这个新的事物与自己认知的事物相比较,从而达到快速学习的目的。我开始学习Symbian的时候,我查看很多Symbian书籍、网上很多Symbian教程都将活动对象与多线程联系到一起,我也总是会把活动对象想象成一个线程。然而,经过了更深入的接触,我发现并不像我想象的那样。现在,我在此向你保证:活动对象和多线程没有任何关系!不要拿平时做多线程的思想去理解活动对
2、象!活动对象可以按照以下步骤这么理解:SymbianOS中提供了很多异步函数,这些异步函数大多部分都是基于“服务器-客户端”架构的。这里与win32api中的函数有很大的不同。如:win32中,CSocket::Receive(是recv而不是WSARecv)为同步函数,线程阻塞在Receive处,直到套接字接收到了网络流才返回。SymbianOS也有类似的函数,RSocket::Receive,但是此函数是一个异步函数,线程不会阻塞在Receive处而会继续执行。如何区分Symbian中的函数哪些是同步的哪些是异步的?很简单:看函数内是否包含类型为TRequestStatus的形
3、参,如果有则函数为异步函数。如RSocket::Receive的函数原型为:IMPORT_CvoidRecv(TDes8&aDesc,TUintflags,TRequestStatus&aStatus);参数aStatus为一个状态位,初始值为ERequestPending(值为1),它意味着用户请求的操作是否执行完毕。如:我们调用异步函数RSocket::Receive请求接收网络流,Receive函数会直接返回。当“接收”网络流的过程完毕后,aStatus会变为EActive,所以我们只要监视aStatus是否不为ERequestPending就可以知道“接收”是否完成了。我们
4、可以使用以下伪代码完成以上所述操作:TRequestStatusstatus(KRequestPending);RSocket::Receive(aDesc,flags,status);for(;;){if(status!=KRequestPending)break;}//此处我们已经通过RSocket::Receive完成了类似CSocket::Receive的同步的工作SymbianOS不建议我们使用以上方法,它建议我们使用异步方法,而不要使用我们这种方法去强制同步,活动对象就是帮我们做这件事情。活动对象体系帮我们监视aStatus的值,只要aStatus!=ERequestP
5、ending,他就会以事件的方式通知我们,告诉我们“Socket已经接收完毕,你可以去取数据了!”,活动对象就是干这事的。总结一下:系统中有一个“活动调度器”,我们建立一个“活动对象ao1”,将该对象与某个系统中的异步函数绑定,然后将该活动对象注册到“活动调度器”中,“活动调度器”会等待异步函数返回的“完成”消息。收到完成消息后,调度器遍历所注册的活动对象,如果发现status!=KRequestPending则找到该status对应的“活动对象ao1”,调用其中的RunL方法,以事件的方式告知我们异步函数已经执行完成。Symbian编程总结-基础篇-活动对象正解(2)-使用活动对
6、象精彩文档实用标准文案我们已经大致了解了活动对象的基本概念,要使用活动对象机制,需要用到活动对象、活动调度器、异步函数。我们想使用异步函数,要按照应用程序->活动对象->活动调度器->异步函数的流程来使用。接下来我们开始进入实战,使用活动对象。一、创建活动调度器我们知道,活动调度器是应用程序和异步函数之间的桥梁,应用程序使用活动对象通过活动调度器去截获异步函数的返回“完成”消息,并以事件的方式通知应用程序。使用CarbideC++1.3,通过模板向导生成的控制台程序自动为我们生成了创建活动调度器的代码:CActiveScheduler*scheduler=new(ELeave)CA
7、ctiveScheduler();CActiveScheduler::Install(scheduler);CActiveScheduler::Install()方法调用以后,内部代码就会将scheduler指针赋值给CActiveScheduler类内部的静态指针,后面的代码就可以方便的使用CActiveScheduler类的静态方法,如:IMPORT_CstaticvoidAdd(CActive*aActive);IMPORT_CstaticvoidStart()
此文档下载收益归作者所有