WEB开发网
开发学院手机开发Symbian 开发 Symbian 编程之活动对象正解 阅读

Symbian 编程之活动对象正解

 2010-03-18 20:58:00 来源:WEB开发网   
核心提示:9、WaitForAnyRequest()等待异步函数返回通知,11、RequestComplete()并将iStatus的值改变当异步服务已经完成了所请求的工作,Symbian 编程之活动对象正解(6),它会使用User::RequestComplete()发送一个通知,活动调度器会通过 User::WaitForA

9、WaitForAnyRequest()等待异步函数返回通知,11、RequestComplete()并将iStatus的值改变

当异步服务已经完成了所请求的工作,它会使用User::RequestComplete()发送一个通知,活动调度器会通过 User::WaitForAnyRequest()或RThread::WaitForAnyRequest()收到这个通知,随后遍历向其注册的条件匹配的活动对象(第8点下划线部分说明)。

12、调用RunL方法

如果找到了异步函数所对应的活动对象,则调用活动对象的RunL方法,RunL方法在TRAP宏里运行。如果RunL方法抛出异常,活动调度器会自动调用活动对象的RunError方法。因此大多数情况下不需要在RunL内编写异常捕获的代码。

活动对象调用完RunL方法后,将活动对象的iActive值设置为EFalse,以便在下次遍历集合时跳过已经处理过的活动对象。

如果没有找到异步函数所对应的活动对象,活动调度器将抛出一个“信号迷失”异常。

13、 CActiveScheduler::Stop()

停止活动调度器,停止监控异步函数返回的信号。

二、活动对象专属错误 -“信号迷失”

从上面的分析我们知道,活动调度器会拦截异步函数返回的消息,随后遍历活动对象集合找到相应的活动对象调用,如果没有找到则抛出“信号迷失”异常。有以下两种方法会导致“找不到活动对象”的发生:

活动对象根本没有注册到活动调度器中:没有调用 CActiveScheduler::Add方法注册活动对象

不满足活动调度器查找活动对象的标准iStatus != KRequestPending && iActive == ETrue:在调用异步函数后,没有调用SetActive()方法将iActive的值设为ETrue;或者将iStatus同时传给两个异步函数,导致第二个异步函数返回时,当前活动对象的iActive为EFalse,调度器找不到相应的活动对象。

三、小结

在这一节里,我们学习了活动对象的内部工作原理,让我们对活动对象处理机制有了更深入的了解。在下一节里,我们将学习如何同步调用现有的异步函数。

Symbian 编程总结-基础篇-活动对象正解(4)-异步函数的同步调用

我们深入了解了活动对象、活动调度器及异步函数服务器的工作原理及运行机制,想必大家对活动对象的机制及体系结构的运用已经了如指掌。但是大家有没有觉得异步函数使用起来比较麻烦呢?难道非要使用活动对象,非得以"异步"的方式调用异步函数吗?这一节将为大家解决这个问题:异步函数的同步使用。

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:Symbian 编程 活动

编辑录入:coldstar [复制链接] [打 印]
赞助商链接