Symbian C++基础之活动对象(Active Objects)
2010-03-22 16:29:00 来源:WEB开发网2. 提交请求
活动对象提交一个请求给服务提供者, 传递 TRequestStatus成员变量(iStatus). 在初始化这个异步请求前, 服务提供者 必须设置这个值为KRequestPending
3. 调用SetActive()标记这个对象处于等待状态
调用CActive::SetActive()指示 请求已经提交,当前还没有完成. 在请求已经提交给服务提供者之后,这个调用才能发出.
处理请求完成
每个活动对象类必须实现从CActive基础类继承来的纯虚函数RunL(). 当一个完成事件出现时, 这是要被活动调度器要调用的事件处理器方法.
RunL()应该通过查看它的完成码来检查异步的请求是否成功, 完成码是一个32位的整数,存储在活动对象的TRequestStatus对象(iStatus)里. 依赖于结果, RunL()可能提交一个新的请求 或者 执行其他处理,比如写日志文件. 根据不同的要求,RunL()函数代码的复杂度差别很大。
因为RunL()在运行时 不能被其他活动对象的事件处理器抢占, 所以,它应该尽可能快地完成,以便其他事件能够没有延迟地被处理.
CActive基类 提供了一个虚函数RunError() , 如果当RunL()发生Leave时,活动调度器会使用TRAP捕获此异步,然后调用这个方法。. 如果RunError()方法没有对异常做处理,那么调度器就要负责处理该异常。如果希望处理RunL()的leaves,应该重写 CActive::RunError()这个方法处理异常。
英文图示
上图演示了, 活动对象提交一个请求给异步的服务提供者时, 要执行的一系列基本的活动
取消一个活动对象
活动对象必须可以取消未完成的异步请求. 活动对象必须实现基础类的纯虚函数DoCancle(): 通过调用适当的异步服务提供者的取消方法来终止一个请求. DoCancle()不必留下或者分配资源, 也不必执行任何冗长的操作,只是简单取消请求,清除相关的资源.
CActive::Cancle()调用DoCancle(),等待请求被终止的通知. 无论何时请求被终止, 必须调用Cancle() 而不是DoCancle(). 因为基础类检查请求是否未完成,在它被终止前,执行必须的等待.
活动对象的基类CActive 提供了一个纯虚方法
DoCancel(),重载这个方法以实现取消请求的功能,但是需要注意的是应用程序以及活动对象本身都不能直接调用这个方法,而是应该调用Cancel()方法。因为Cancel()方法中首先检查活动标记,对于处于活动状态的活动对象调用DoCancel(),然后将活动标记设为EFalse。调用Cancel() 后如果请求被取消,服务提供者仍然会发送一个异步事件,并将状态标记的返回值设为KErrCancel。
更多精彩
赞助商链接