1.   SymbianOS基于微内核模型,微内核模型被设计得尽可能小,通过服务器提供绝大多数的服务。
      这里的服务器其实是一个独立的进程,服务器进程通过与客户端(通常是某个应用)建立通信提供服务。而这种通信通常由服务器提供的客户端方使用的类来封装实现的。

      在许多情况下,服务器运行自己的进程,提供保护性和模块性。服务器和客户端总是运行在不同的线程上,很多异步函数也是在服务器中实现。

      所有的服务器都是从CActive派生来的,它们都是活动对象.

在Symibian OS中所有的异步服务都是Server通过C/S架构来实现的。Client是利用Server提供的特定服务的程序,Server接受来至Client的请求消息并同步或异步的处理他们。C/S架构有如下的优点:

1,可扩展性

2,有效性:相同的Server可以服务多个Client。

3,安全性:Server和Client存在于单独的进程中,并且通过消息传递进行通信。具有错误行为Client不会使他的Server崩溃(但是,Server可以通过客户线程的句柄来是具有错误行为的Client产生严重错误)。

4,异步性:在服务器完成请求的时候使用AO机制来通知他的Client。通过AO来挂起线程而不是轮询请求的状态,SymbianOS减少了处理该请求的处理器周期,从而节约了电源,这对于移动设备来说是非常重要的。

2. 子会话.

      每次打开会话时都需要消耗更多的内核资源.客户/服务器框架在现有会话功能上提供了子会话功能,这有效地解决了需要多个客户会话的功能。子会话比完全会话使用较小的开销,但在客户端的实现也更复杂。

      子会话是一咱让客户与服务器进行通信,而不需要单个会话来表示每个客户端的,轻量级方法.

      客户与服务器建立单个会话,然后为每个对象创建子会话,每个子会话和会话关联,借此进行实际的进程间通信.

  子会话必须与父客户会话相关联,因此对于支持子会话的服务器,至少有两个客户端类:一个由RSessionBase派生的会话类,一个由RSubSessionBase派生的子会话类。典型的子会话类RFile,RSocket

3.    框架解析  

       AppUi的几个重要事件处理方法:

HandleWsEventL()用于处理窗口服务器传递的事件,它的作用使框架调用下面这些具体事件处理方法;

HandKeyEvent()用于处理用户按键事件(此函数在控件堆栈为空时调用,否则框架将会调用OfferKeyEventL函数);

HandleForegroundEventL()当应用程序切换到前台或从前台切换到后台时调用该函数,默认的实现可以处理键盘焦点的改变;

HandleSystemEventL()用于处理由窗口服务器生成的事件;

HandleApplicationSpecificEventL()用于处理自己定义的自定义事件。默认的实现可以处理颜色方案改变的通知;

HandleCommandL()用于处理用户选择的菜单项;

HandleSwitchOnEventL()用于处理像设备切换之类的特定切换事件;

HandleMessageReadyL()用于处理窗口服务器产生的消息事件。

在以上各函数处理事件中,除了第一个HandleWsEventL()函数外,其它函数默认都是纯虚函数,需要重载才能用。

设置全屏Symbian   C++应用程序,有三种方法: 

1、覆盖system   panes  
     这个方法主要用在传统的view架构中,当view不是全屏时,可以通过调用CCoeControl::SetExtentToWholeScreen()方法来获取全屏,应该在MyView::ConstructL中调用ActivateL()之前调用。
   当应用程序为skinned时是不推荐使用这个函数的(从Series60   2nd   Edition向后,查看配置)。不管怎么说,全屏程序也不需要这个设置,因此这个应该不是问题:)  
  2、隐藏  
  MEikAppUiFactory*   f   =   CEikonEnv::Static()->AppUiFactory();  
  iStatusPane   =   f->StatusPane();  
  iToolBar   =   f->ToolBar();  
  if(   iToolBar   )  
          iToolBar->MakeVisible(   EFalse   );  
   
  if(   iStatusPane   )  
          iStatusPane->MakeVisible(   EFalse   );   
    
  3、iContainer   =   CYourContainer::NewL(AppUi()->ApplicationRect(),   *this);  
  这样控件将被全屏

       http://www.cppblog.com/franksunny/archive/2007/09/21/32597.aspx

1.http://www.newlc.com/Symbian-OS-Error-Codes.html

2.avkon 0

传入listbox中的描述符的格式有错误。

3.eikon dialog 3

避免在资源文件枚举中使用保留的ID
From Forum Nokia Wiki
From Forum Nokia Technical Library

在定义MENU_ITEM的Command时不能使用0,0是保留给EEikCmdCanceled使用的。

DIALOG中的每项ID也不能是0,0被系统保留。

上面的枚举是很典型的,并且我们习惯定义枚举时从0开始,当用在资源文件中时很可能造成了很奇怪的错误,这种情况通常很难找到bug的原因。

对话框中的项ID如果使用了0会产生下面的Panic信息:“Eikon-Dialog 3”在这里3的意思是EEikDialogPanicFocusableLineWithIdZero。

4.setting item lis

http://wiki.forum.nokia.com/index.php/Setting_Item_List_panics

5. c:/resource/ErrRd

6. viewsrv 9

   由于 在appui中重写了PrepareToExit(),但其中没有调用父类的PrepareToExit()

7.CTypefaceStore -14
    CCoeEnv::Static()->ScreenDevice()->GetNearestFontInTwips和ReleaseFont必须成对出现.

8.Des16Align 18

  when you pass strings to Format() you have to pass pointer to TdesC.

  当函数返回 TPtrC(const unsigned short) 时,以TPtrC函数的返回值,不要使用const TDesC&

9.初学S60,常见问题记录

  http://blog.163.com/henan_lujun/blog/static/19538333200943110110559/

10.ESock_Client 14 错误:为描述符无效的错误。

    在模拟器一次发送30K时出现,真机没测试。

    sock serv和客户程序是不同进程, 所以在给异步函数传递小描述符时, 客户程序函数还没有返回, 此时可能成功, 但是对大描述符, 失败的几率就很高。所以,给异步函数传参数时不要传局部变量。

11.系统控件new出来最后没有被删除,会报 CONE 8错误Environment found window server resources had not been freed。

12. EIKCTL 42

EIKCTL 42 panic (Invalid bitmap index in CColumnListBoxData::raw())
使用了系统的ListBox, 传入的格式化字符串不对,比如图片数组里只有两张图片,而传入了/t3 ,就会报这个错误.
这个表明绘制控件时出现无效的资源句柄,如bitmap等.
 
         

使用了系统的ListBox, 传入的格式化字符串不对,比如图片数组里只有两张图片,而传入了/t3 ,就会报这个错误.

这个表明绘制控件时出现无效的资源句柄,如bitmap等.

13.“存储已满”

    可能是有大量内存泄露导致。比如在多次循环中都有泄露。

14. 新建一个ui工程,编译报This project does not support  program "BUILD_HELP" for platform "WINSCW"。

     这个问题在carbide从2.3升级到2.6后出现。

     把 bld.inf 文件里面 gnumakefile  ../help/build_help.mk 路径里面的正斜线改称反斜线。

  

16.编译v5真机时,提示 dll contains initialized writable data,

     在mmp中添加 EPOCALLOWDLLDATA

17.内存泄露。

    所有应用程序分配的资源必须在程序结束时清理干净。在模拟器上,使用 debug 编译生成,没有这么做会由 __UHEAP_MARKEND 宏产生一个严重错误。
    因为 STDLIB's DLL 在线程本地存储(thread-local storage)中分配的数据(结构体 _reent)在环境被销毁时不会被自动清理,它必须由 STDLIB 的使用者进行清理(CloseSTDLIB())。
    使用这个函数,应在工程中包含 reent.h 文件。

     Because the data allocated in the thread-local storage for STDLIB's DLL (the _reent structure) is not automatically cleaned up when the environment is destroyed, it must be cleaned up by the user of STDLIB
     The function to achieve this is CloseSTDLIB(). To use this function, file epoc32/include/libc/sys/reent.h should be included in the project. Call CloseSTDLIB() after the point at which it is known that code in STDLIB's DLL will no longer be called and its thread-local storage no longer needed.

     #include <reent.h>

     CloseSTDLIB();

1.socket模拟http请求cmwap下载一个4k的文件。

iSocket.RecvOneOrMore(iNetBuff,0,iStatus,iLen);
   SetActive();

和异步回响之间返回推送页需要7-8秒,返回实际数据时需要4-5秒.

请求cmwap时设置EKeep_Alive,就可以在接收完推送页内容后继续发送请求而不用再连接socket。

若设置Close,则连续发送请求会返回 KErrEof

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐