转自杨芹勍《活动对象正解(1)-理解活动对象》
Symbian OS中的活动对象的使用无疑是最基础的、最频繁的、最重要的。什么是活动对象呢?
大家学习一个新的事物时,总是会将这个新的事物与自己认知的事物相比较,从而达到快速学习的目的。我开始学习Symbian的时候,我查看很多
Symbian书籍、网上很多Symbian教程都将活动对象与多线程联系到一起,我也总是会把活动对象想象成一个线程。然而,经过了更深入的接触,我发
现并不像我想象的那样。
现在,我在此向你保证:活动对象和多线程没有任何关系!不要拿平时做多线程的思想去理解活动对象!
活动对象可以按照以下步骤这么理解:
-
Symbian OS中提供了很多异步函数,这些异步函数大多部分都是基于“服务器-客户端
”架构的。这里与win32 api中的函数有很大的不同。如:
win32中,CSocket::Receive(是recv而不是WSARecv)为同步函数,线程阻塞在Receive处,直到套接字接收到了网络流才返回
。
Symbian OS也有类似的函数,RSocket::Receive,但是此函数是一个异步函数,线程不会阻塞在Receive处而会继续执行
。
-
如何区分Symbian中的函数哪些是同步的哪些是异步的?很简单:看函数内是否包含类型为TRequestStatus的形参
,如果有则函数为异步函数。如RSocket::Receive的函数原型为:
IMPORT_C void Recv(TDes8 &aDesc, TUint flags, TRequestStatus &aStatus);
-
参数aStatus为一个状态位,初始值为ERequestPending(值为1),它意味着用户请求的操作是否执行完毕。如:我们调用异步函
数RSocket::Receive请求接收网络流,Receive函数会直接返回。当“接收”网络流的过程完毕后,aStatus会变为
EActive,所以我们只要监视aStatus是否不为ERequestPending
就可以知道“接收”是否完成了。
-
我们可以使用以下伪代码完成以上所述操作:
TRequestStatus status(KRequestPending);
RSocket::Receive(aDesc, flags, status);
for (;;)
{
if (status != KRequestPending) break;
}
// 此处我们已经通过RSocket::Receive完成了类似CSocket::Receive的同步的工作
-
Symbian OS不建议我们使用以上方法,它建议我们使用异步方法,而不要使用我们这种方法去强制同步,活动对象就是帮我们做这件事情。活动对象体系帮我们监视aStatus的值,只要aStatus != ERequestPending,他就会以事件的方式通知我们,告诉我们“Socket已经接收完毕,你可以去取数据了!”
,活动对象就是干这事的。
-
总结一下:
系统中有一个“活动调度器”,我们建立一个“活动对象ao1”
,
将该对象与某个系统中的异步函数绑定,然后将该活动对象注册到“活动调度器”中,“活动调度器”会等待异步函数返回的“完成”消息。收到完成消息后,调度
器遍历所注册的活动对象,如果发现status !=
KRequestPending则找到该status对应的“活动对象ao1”,调用其中的RunL方法,以事件的方式告知我们异步函数已经执行完成。
分享到:
相关推荐
### Symbian Socket 结合活动对象 异步函数 详细深入讲解 在移动开发领域,尤其是在早期智能手机操作系统Symbian中,实现网络通信是至关重要的技术之一。本文将详细介绍如何在Symbian平台上利用Socket结合活动对象...
在"基于ACE的活动对象实例"中,我们可以深入理解如何利用ACE库来实现活动对象。首先,ACE库提供了一组类和模板,如`ACE_Task`、`ACE_Svc_Handler`等,它们可以帮助我们创建并发执行的实体。`ACE_Active_Object`是...
1. **继承活动对象类**:首先,你需要创建一个类,该类继承自Symbian提供的基类 CActive 或其派生类,如 CActiveScheduler 或 CActiveGroup。这将使你的对象具备处理异步请求的能力。 2. **状态管理**:活动对象有...
1. **调度与同步**:活动对象通过系统调度器进行调度,保证在适当的时间被激活。同步问题主要涉及如何确保多个活动对象之间的协调,防止数据竞争和死锁。 2. **状态管理**:每个活动对象都有自己的状态,如等待、...
下面我们将深入探讨Symbian活动对象的原理、设计模式以及如何通过`TestAOConsole`这个例子来理解它的用法。 1. **活动对象的原理**: - **线程上下文切换**:Symbian OS中,线程是CPU资源分配的基本单位。但是频繁...
1. **封装**:封装是面向对象的核心特征之一,它隐藏了对象内部的实现细节,仅对外提供接口供其他部分调用。这样可以确保数据的安全,降低系统复杂性,提高代码的可维护性。 2. **继承**:继承允许子类从父类那里...
1. `RunL()`: 这是活动对象的主要工作函数,当调度器决定执行该对象时,会调用此函数。 2. `DoCancel()`: 用于取消正在进行的操作,确保资源得到正确释放。 3. `RunError()`: 当在`RunL()`中发生错误时,系统会调用...
1. **架构主机(Schema Master)**:负责维护整个森林的架构信息。任何对对象类、属性或架构的修改都需要由架构主机完成。例如,当添加新的应用程序需要扩展AD架构时,就需要这台服务器的角色。 2. **配置主机...
标题中的“dateandtime”和“s60活动对象测试例子”揭示了这个示例程序主要涉及S60平台上的日期和时间显示,以及如何利用活动对象(Active Object)进行定时更新。S60是诺基亚开发的一个基于塞班(Symbian)操作系统...
2. 函数上下文中的变量对象:当一个函数被调用时,一个活动对象(Activation Object, AO)会被创建,它作为变量对象来使用。活动对象除了存储变量和函数声明外,还包含了函数的参数(formal parameters)和arguments...
在Symbian操作系统中,线程(Thread)和活动对象(Active Object)是两种关键的并发执行机制,它们用于管理应用程序中的多任务处理。在这个极好的实例中,我们将深入探讨这两种概念及其在S60平台上的应用。 首先,...
1. 面向对象的基本概念:对象、类、继承、封装和多态性的深入解释。 2. UML(统一建模语言):学习如何使用UML图表进行系统建模,包括类图、用例图、序列图和状态图等。 3. 设计模式:详细解析常用的设计模式,以及...
本篇将深入探讨易语言中Excel对象的常见操作。 一、创建Excel对象 在易语言中,首先需要创建一个Excel对象,这通常通过“创建对象”命令来完成,指定对象类型为Microsoft Excel的应用程序。创建成功后,便可以通过...
【标签】同样强调了"活动对象2 张锦锋Symbian讲座",表明这是一个系列讲座的第二部分,可能前一部分已经介绍了Symbian的基础知识,而这一部分可能会更深入,比如涵盖高级开发技巧、系统架构解析或者是实际项目案例...
在本案例Demo中,我们将深入探讨Unity对象池的工作原理、实现方法以及如何在实际项目中应用。 对象池的主要目标是管理游戏中的短期和中期生存的对象,例如子弹、敌人或者粒子效果。当这些对象不再需要时,它们不是...
在本教程中,我们将深入探讨如何使用Boost.C++库,特别是Boost.Asio,来构建一个基于代码的客户端-服务器系统,采用活动对象模式。Boost.Asio是C++中用于网络编程的一个强大库,它提供了异步I/O操作,使得开发者能够...
【标题】"活动对象3 张锦锋Symbian讲座" 涉及的主要知识点是Symbian操作系统以及与之相关的技术讲座。Symbian是一个历史悠久的移动操作系统,尤其在2000年代中期至晚期,它曾是智能手机市场的主导平台之一,广泛应用...
2. **对象复用**:当需要创建新对象时,对象池会从池中获取一个非活动对象,而不是创建新的实例,从而避免了频繁的内存分配和垃圾回收。 3. **对象回收**:当对象不再需要时,而不是立即销毁,它会被返回到对象池中...