彻底理解 Symbian 活动对象
2010-08-24 05:50:00 来源:WEB开发网EPriorityHigh=20
当调用CActiveScheduler::Add方法注册活动对象时,活动调度器会按照活动对象的优先级进行排序,插入或添加到活动对象集合中。在此会起到如下作用:当多个异步函数消息同时返回时(多个iStatus同时不为KRequestPending),活动对象调度器轮训集合的时候总是会先找到优先级高的活动对象并调用其RunL方法。
但是在通常情况下,我们会在构造函数传入EPriorityStandard。
三、活动调度器Start方法的伪代码
通过以上两点分析,我们完全可以模拟出CActiveScheduler::Start方法:
void CActiveScheduler::Start()
{
for//// 注:活动调度器和应用程序不在一个线程,所以应用程序不会阻塞
User::WaitForAnyRequest(); // 如果异步函数和主程序在不同的线程则RThread::WaitForAnyRequest();
//// 以优先级降序的方式检测调度器集合中每个活动对象
for (;;)
{
// 调用第一个已完成且iActive == ETrue的活动对象事件处理函数
if (activeObject->IsActive() && activeObject->iStatus != KRequestPending)
{
// 找到一个已准备好处理事件的活动对象
// 重置iActive状态以表明其不再是活动状态了
activeObject->iActive =// 在TRAP中调用活动对象的事件处理函数
TRAPD(err, activeObject->RunL())
;
if (err != KErrNone)
{
// 如果异常则调用活动对象的RunError方法
err = activeObject->RunError();
if (err != KErrNone)
{
Error(err);
}
}
break;
}
}
}
}
四、使用活动对象的例子
点击此处下载源代码
此例子将启动一个控制台程序,并使用异步服务类RTimer定时器,每隔一秒在屏幕上显示累加的数字,效果如下:
五、小结
在这一节中,我们基本了解了活动调度器、活动对象的工作机制及工作流程,在下一节里,我们将深入活动对象的内部,了解其工作原理,进一步加深对活动对象的理解。
更多精彩
赞助商链接