本文章由杨芹勍原创,如需转摘请注明出处。谢谢!

Symbian OS中的活动对象的使用无疑是最基础的、最频繁的、最重要的。什么是活动对象呢?

大家学习一个新的事物时,总是会将这个新的事物与自己认知的事物相比较,从而达到快速学习的目的。我开始学习Symbian的时候,我查看很多Symbian书籍、网上很多Symbian教程都将活动对象与多线程联系到一起,我也总是会把活动对象想象成一个线程。然而,经过了更深入的接触,我发现并不像我想象的那样。

现在,我在此向你保证:活动对象和多线程没有任何关系!不要拿平时做多线程的思想去理解活动对象!

活动对象可以按照以下步骤这么理解:

  1. Symbian OS中提供了很多异步函数,这些异步函数大多部分都是基于“服务器-客户端”架构的。这里与win32 api中的函数有很大的不同。如:
    win32中,CSocket::Receive(是recv而不是WSARecv)为同步函数,线程阻塞在Receive处,直到套接字接收到了网络流才返回
    Symbian OS也有类似的函数,RSocket::Receive,但是此函数是一个异步函数,线程不会阻塞在Receive处而会继续执行
  2. 如何区分Symbian中的函数哪些是同步的哪些是异步的?很简单:看函数内是否包含类型为TRequestStatus的形参,如果有则函数为异步函数。如RSocket::Receive的函数原型为:
    IMPORT_C void Recv(TDes8 &aDesc, TUint flags, TRequestStatus &aStatus);
  3. 参数aStatus为一个状态位,初始值为ERequestPending(值为1),它意味着用户请求的操作是否执行完毕。如:我们调用异步函数RSocket::Receive请求接收网络流,Receive函数会直接返回。当“接收”网络流的过程完毕后,aStatus会变为EActive,所以我们只要监视aStatus是否不为ERequestPending就可以知道“接收”是否完成了。
  4. 我们可以使用以下伪代码完成以上所述操作:
    TRequestStatus status(KRequestPending);
    RSocket::Receive(aDesc, flags, status);
    for (;;){if (status != KRequestPending) break;}
    // 此处我们已经通过RSocket::Receive完成了类似CSocket::Receive的同步的工作
  5. Symbian OS不建议我们使用以上方法,它建议我们使用异步方法,而不要使用我们这种方法去强制同步,活动对象就是帮我们做这件事情。活动对象体系帮我们监视aStatus的值,只要aStatus != ERequestPending,他就会以事件的方式通知我们,告诉我们“Socket已经接收完毕,你可以去取数据了!”,活动对象就是干这事的。
  6. 总结一下:系统中有一个“活动调度器”,我们建立一个“活动对象ao1”,将该对象与某个系统中的异步函数绑定,然后将该活动对象注册到“活动调度器”中,“活动调度器”会等待异步函数返回的“完成”消息。收到完成消息后,调度器遍历所注册的活动对象,如果发现status != KRequestPending则找到该status对应的“活动对象ao1”,调用其中的RunL方法,以事件的方式告知我们异步函数已经执行完成。

在下一节我会介绍如何使用活动对象。

转载于:https://www.cnblogs.com/felixYeou/archive/2008/11/20/1337334.html

Symbian编程总结-基础篇-活动对象正解(1)-理解活动对象相关推荐

  1. Symbian编程总结-基础篇-描述符(2)-TDesC8与TDesC16之间的互转

    1.使用Copy _LIT8(KTestStr, "This is a string"); TBufC8<50> buf(KTestStr); TBuf<100& ...

  2. java并发编程艺术——基础篇

    这篇文章目的是为了总结一下这段时间看<java并发编程艺术>学到的东西,尝试用自己的话说出来对java多线程的理解和使用. 一.什么是多线程,为什么要用多线程,多线程带来的挑战 多线程定义 ...

  3. C++ 学习 ::【基础篇:17】:C++ 类与对象:运算符重载介绍、运算符重载函数(类内与类外区别)写法及简单设计实现

    本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇.STL 篇.高阶数据结构与算法篇,相关重点内容如下: 基础篇:类与对象(涉及C++的三大特 ...

  4. 【shell编程】基础篇

    文章目录 基础篇 一.Shell概述 二.脚本定义与执行 三.shell中的变量 四.运算符 五.条件判断 六.流程控制 七.read读取控制台输入 八.函数 九.Shell工具 基础篇 一.Shel ...

  5. 【linux】循序渐进学运维-基础篇-netstat命令详解

    大家好,我是高胜寒,本文是Linux运维-循序渐进学运维-基础篇的第62篇文章 文章目录 前言 一. netstat命令详解 作用 1. 常用参数 2. 命令使用 1) 参数作用详解 2) 网络连接状 ...

  6. BSGS(基础篇,题目+详解)

    基础篇 问题: 思路: 模板: 题目: 基础篇 问题: 给出 a , b , p a,b,p a,b,p,其中 g c d ( a , p ) = 1 gcd(a,p)=1 gcd(a,p)=1,求 ...

  7. 以下是关于ASP.NET中保存各种信息的对象的比较,理解这些对象的原理,对制作完善的程序来说是相当有必要的(摘至互联网,并非原创--xukunping)...

    在ASP.NET中,有很多种保存信息的对象.例如:APPlication,Session,Cookie,ViewState和Cache等,那么它们有什么区别呢?每一种对象应用的环境是什么?     为 ...

  8. php 赋值给 dom对象,详解PHP原生DOM对象操作XML的方法

    详解PHP原生DOM对象操作XML的方法 发布于 2017-08-08 20:15:29 | 80 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertext ...

  9. java对象实例_深入理解Java对象实例生成的例子!(转)

    深入理解Java对象实例生成的例子!(转)[@more@]代码如下: class A { public int Avar; public A() { System.out.println(" ...

  10. ADO.NET常用对象详解之:Command对象

    1.Command对象概述   Command对象可以使用数据库命令直接与数据源进行通信.它的属性如下:   Name:Command对象的程序化名称.在代码中使用此名称来引用Command对象.   ...

最新文章

  1. Oracle忘记用户名和密码的解决方案
  2. 炫酷背光文字html,详细PS教程大放送:如何快速做出高级创意的文字背光效果?...
  3. linux登出系统,讲解Linux操作系统进入与退出系统方法
  4. STM32F4 HAL库开发 -- 温度传感器(DS18B20)
  5. android的findviewbyid,Android O预览findViewById编译错误
  6. sdut 活动选择问题
  7. 界面设计--北京创享数码的设计案例(很不错的看看吧)
  8. ASP.NET Core2.2 和2.1 版本中对cookie的设置和存储
  9. Palo Alto Networks下一代安全平台五大创新功能:云安全为重中之重
  10. 材料成型及控制工程学计算机吗,材料成型及控制工程专业属于什么学科
  11. 计算机驱动空间的c盘不足怎么办,C盘磁盘空间不足怎么解决
  12. 在Ubuntu中安装中文输入法
  13. 13 函数列与函数项级数
  14. nu.xom:Document
  15. java实现图片去掉水印
  16. 宏基(Acer)笔记本(5583)拆机清洗风扇
  17. 全国计算机三级网络工程技术复习笔记4
  18. c语言编译星座测试,用c语言编写程序,判断输入的日期(月,日)属于哪个星座?...
  19. Android DLNA投屏-基本原理
  20. win10更新服务打开后为什么服务拒绝访问

热门文章

  1. 数据结构与算法之图的进阶
  2. html的调用方法详解,HTML5标签使用方法详解
  3. python脚本根据cookies自动登录网站_为爬虫获取登录cookies:使用万能钥匙 Selenium 搞定一切登录...
  4. wifi协议_以太网(Ethernet)和WiFi协议
  5. mfc oracle数据库编程,testmfc - 源码下载|数据库系统|Oracle数据库|源代码 - 源码中国...
  6. mysql 复杂类型_MySQL 复杂数据类型之JSON数据
  7. 码云怎么创建公开的仓库_使用码云创建属于你的免费私有git仓库
  8. 数字表达_高级表白密码,教你如何用数字表达出我爱你
  9. license授权什么意思_微信公众号的scope权限什么意思
  10. java ee性能_如何进行Java EE性能测试与调优