Browsed by
Category: symbian

一个还不错的symbian面试题

一个还不错的symbian面试题

刚想到一个还不错的symbian面试题 问题:根据AO的运行机制,通常会有如下的调用,TRequestStatus *status=&iStatus;User::RequestComplete(status, KErrNone); SetActive(); 假设,现在把User::RequestComplete(status, KErrNone); 换成iStatus = KErrNone。会有什么样的后果,请说明为什么? 分析: 这个题目考察了AO的运行原理和AS的内部机制,如果对AO的机制不是特别了解是没办法解答这道题目的。 首先,我们来看看AS的运行机制1.  调用 User::WaitForAnyRequest,这个函数会一直block住,直到当前线程收到一个semaphore2.  当收到一个信号时,3.  循环AS中所有的AO4.       检查AO的iStatus是否是KRequestPending,如果是,继续往下不是,则检查下一个AO5.          检查该AO是否已经active了,即SetActive已经调用过了。6.            如果满足条件,调用AO的RunL7.  Goto 1 好了,我们现在来看题目,这个AO已经调用了SetActive(),所以它满足第5行的条件,然后iStatus = KErrNone,那么它也满足第4行的条件。所以,就掉入了下面的假设。 如果系统里面就这么一个AO,那么什么都不会发生。如果系统里面有超过一个AO,而又有别的AO调用了例如User::RequestComplete(iStatus, KErrNone)之类的语句,使得第1行的条件满足,那么我们修改的AO就有可能被调用。什么情况下会被调用呢?是在我们改动的AO的优先级比别的AO都高时,它就会被调用。这么说来,这样的改动是可行的吗?当然不是,如果当前AO被调用到,那么意味着系统中一个期待被响应的AO被抢占了,所以,AS状态就乱了,最终会导致E32USER-CBase 46的panic,这是因为系统始终多处理一个AO,最后一次第一行响应后,发现没有AO了,就会报错。 缩写:AO — Active Object AS — Active Scheduler

流的operator<<() 内部流程

流的operator<<() 内部流程

首先,在symbian内部,它申明了这么一个模板方法:template <class T>inline RWriteStream& operator<<(RWriteStream& aStream,const T& anObject)    {    DoExternalizeL(anObject,aStream,Externalization(&anObject));    return aStream;    } 接着又定义了DoExternalizeL的两个overload方法:template <class T>inline void DoExternalizeL(const T& anObject,RWriteStream& aStream,Externalize::Member)    {anObject.ExternalizeL(aStream);} template <class T>inline void DoExternalizeL(const T& anObject,RWriteStream& aStream,Externalize::Function)    {ExternalizeL(anObject,aStream);} 根据不同的的Externalization类型,会选择两个不同的调用方法。 在store框架中,默认了一个原形是:Externalize::Member Externalization(const TAny*)这就解释了,为什么在store体系下,流只用在该类中加入ExternalizeL方法就可以执行operator<<()调用了。 而Implementation for a class without ExternalizeL() & InternalizeL()介绍过一种方法:implement the following Externalization() and Internalization() global functions: inline Externalize::Function Externalization(const TNonstore*)          {return Externalize::Function();}inline Internalize::Function Internalization(TNonstore*)          {return Internalize::Function();} declare the following ExternalizeL() and InternalizeL() global functions: void ExternalizeL(const TNonstore& aClass,RWriteStream& aStream);void InternalizeL(TNonstore& aClass,RReadStream& aStream); implement the ExternalizeL() and…

Read More Read More

[原]symbian C++搭建环境之carbide C++,vc6,vs2003篇

[原]symbian C++搭建环境之carbide C++,vc6,vs2003篇

不得不说的话:   搭建整个环境对于初学者来说的确是复杂的,希望通过本文,让不明白的人能够快速入门。      在正式开始之前,需要知道:      1、我们搭建的是nokia平台下的开发环境,uiq的平台下的我还没有测试过,原理应该类似。      2、为了简单起见,我们以搭建s60的环境为例,其它的nokia平台与此类似。      3、我们需要了解一下nokia提供的平台sdk根据IDE有所区别,下面是引用最新资料(2006.9.22)          a、IDE: Carbide.c++ 下需要支持如下的sdk               * SDK for 3rd Edition               * SDK for 2nd Edition, FP 3 (FP = feature pack)               * SDK for 2nd Edition, FP 2               * SDK for 2nd Edition, FP 1               * SDK for 2nd Edition           b、IDE: CodeWarrior                * SDK for 3rd Edition               * SDK for 3rd Edition – Japanese               * SDK for 2nd Edition, FP 3 (FP = feature pack)               * SDK for 2nd Edition, FP 2               *…

Read More Read More