彻底理解 Symbian 活动对象
2010-08-24 05:50:00 来源:WEB开发网活动对象根本没有注册到活动调度器中:没有调用CActiveScheduler::Add方法注册活动对象不满足活动调度器查找活动对象的标准iStatus != KRequestPending && iActive == ETrue:在调用异步函数后,没有调用SetActive()方法将iActive的值设为ETrue;或者将iStatus同时传给两个异步函数,导致第二个异步函数返回时,当前活动对象的iActive为EFalse,调度器找不到相应的活动对象。
三、小结
在这一节里,我们学习了活动对象的内部工作原理,让我们对活动对象处理机制有了更深入的了解。在下一节里,我们将学习如何同步调用现有的异步函数。
Symbian编程总结-基础篇-活动对象正解(4)-异步函数的同步调用
我们深入了解了活动对象、活动调度器及异步函数服务器的工作原理及运行机制,想必大家对活动对象的机制及体系结构的运用已经了如指掌。但是大家有没有觉得异步函数使用起来比较麻烦呢?难道非要使用活动对象,非得以"异步"的方式调用异步函数吗?这一节将为大家解决这个问题:异步函数的同步使用。
一、使用CActiveSchedulerWait类
在以前的文章""里我们已经看到了CActiveSchedulerWait类的使用方法,在此我再详细介绍一下。
很多初学者在开始时会将CActiveScheduler和CActiveSchedulerWait类弄混,CActiveScheduler是活动对象的调度器,而CActiveSchedulerWait可以简单的理解为一个当前线程的阻塞器:
因此,我们在不修改原来活动对象代码的情况下,只要简单的在异步函数调用方法后加上"CActiveSchedulerWait::Start()",在活动对象的RunL方法的开头加入"CActiveSchedulerWait::AnsycStop()"就可以了。
针对上一节教程介绍的控制台应用程序,我们对以下几个方法(下划线为修改部分)进行修改:
CActiveSchedulerWait* iWait;
void CMyActiveObject::ConstructL()
User::LeaveIfError(iTimer.CreateLocal() ); // Initialize timer
CActiveScheduler::Add( this); // Add to scheduler
iWait = new (ELeave)CActiveSchedulerWait;
CMyActiveObject::~CMyActiveObject()
Cancel(); // Cancel any request, if outstanding
iTimer.Close(); // Destroy the RTimer object
// Delete instance variables if any
更多精彩
赞助商链接