OMReactive 类是所有反应对象的框架基类,它实现基本事件处理功能。这个类是在文件 omreactive.h 中声明的。
反应对象通常通过状态图或活动图处理事件。反应对象的主要接口有 gen 和 takeTrigger 方法。
触发式操作是影响反应类状态的同步事件。生成的代码将创建一个事件,然后通过调用 takeTrigger 方法将此事件传递给反应类。有关触发式操作的更多信息,请参阅 分派触发式操作。
发送方对象应用 gen 方法以将继承 OMReactive 的事件发送给接收方。此事件随后在线程中被放入队列。请参阅生成事件和事件排队。
execute 方法等待线程的事件队列。当队列中出现某个事件时,此方法会使用 takeTrigger 方法将该事件分派给适当的 OMReactive 对象。
active
这个受保护属性用于指定反应对象(派生自 OMReactive 的具体对象)是否还是活动对象。活动对象创建自己的线程,并且还继承 OMThread 对象。
缺省值为 0 或 FALSE。
如果反应对象是活动对象,那么用户应用程序将调用线程 start;否则,它不会调用此线程。
其定义如下所示:
OMBoolean active;
frameworkInstance
这个受保护属性用于指定反应对象是否由框架自身使用(它不是用户定义的对象)。
缺省值为 0 或 FALSE,并且由反应对象的构造函数 OMReactive 指定。
frameworkInstance 属性可用于根据 Rational® Rhapsody® 框架自身对其进行建模。缺省值为 FALSE;您一般不需要更改缺省值。
其定义如下所示:
OMBoolean frameworkInstance;
myStartBehaviorEvent
这个受保护属性用于激活其缺省过渡中包含空过渡的对象。
其定义如下所示:
OMStartBehaviorEvent myStartBehaviorEvent;
omrStatus
这个受保护属性用于定义反应对象的内部状态(不是状态图中的用户类状态)。
缺省值为 OMRDefaultStatus,并且由反应对象的构造函数 OMReactive 指定。
其定义如下所示:
long omrStatus;
toGuardReactive
这个受保护属性用于指定使用互斥对象(一个二进制信标)来守护事件使用。
缺省值为 0 或 FALSE,并且由反应对象的构造函数 OMReactive 指定。代码生成根据用户模型自动将 toGuardReactive 设置为 TRUE。
其定义如下所示:
OMBoolean toGuardReactive;
eventConsumed
指定已使用事件。其定义如下所示:
#define eventConsumed
OMReactive::OMTakeEventCompleted
eventNotConsumed
指定事件已完成,但未被使用。其定义如下所示:
#define eventNotConsumed
OMReactive::OMTakeEventCompletedEventNotConsumed
OMRDefaultStatus
指定 omrStatus 属性的缺省值。此常量由 OMReactive 使用。
其定义如下所示:
const long OMRDefaultStatus = 0x00000000L;
OMDefaultThread
定义 OMReactive 对象的缺省线程。缺省值为 0 或 NULL,这将告知 OMReactive 对象在系统缺省活动类中处理其事件。
其定义如下所示:
#define OMDefaultThread 0
OMRInDtor
用于设置和获取存储在 omrStatus 中的 OMReactive 内部状态。此常量与 omrStatus 配合使用以停止事件分派。
OMRInDtor 不提供互斥保护(互斥是指试图将事件分配给在另一个线程中已删除的类)。如果您要提供互斥保护,请参阅 Rational Rhapsody 代码生成文档。
其定义如下所示:
const long OMRInDtor = 0x00020000L;
OMRNullConfig
用于获取和设置存储在 omrStatus 中的 OMReactive 内部状态。此常量与 omrStatus 配合使用,以确定是否需要在生成的代码中执行空过渡(没有触发器的过渡)。
其定义如下所示:
const long OMRNullConfig = 0x00000001L;
OMRNullConfigMask
用于获取和设置存储在 omrStatus 中的 OMReactive 内部状态。此常量与 omrStatus 配合使用,以确定 OMReactive 实例是否应在状态机中执行空过渡。
其定义如下所示:
const long OMRNullConfigMask = 0x0000FFFFL;
OMRShouldCompleteStartBehavior
用于获取和设置存储在 omrStatus 中的 OMReactive 内部状态。此常量与 omrStatus 配合使用,以确定在调用 startBehavior 时是否已完成进入状态机,如果未完成,那么确定是否要执行其他空过渡。
如果 shouldCompleteRun 方法对 omrStatus 返回 TRUE,那么这个位由 startBehavior 方法设置。
发生第一个事件时,这个位将被 processEvent 方法重置。
其定义如下所示:
const long OMRShouldCompleteStartBehavior =
0x00080000L;
OMRShouldDelete
用于获取和设置存储在 omrStatus 中的 OMReactive 状态。此常量与 omrStatus 配合使用,以确定当反应对象到达其状态机中的终止接头时,是否被其活动对象删除。这使以统计方法分配的对象可以在其状态机中拥有终止接头。
其定义如下所示:
const long OMRShouldDelete = 0x00040000L;
OMRShouldTerminate
用于获取和设置存储在 omrStatus 中的 OMReactive 内部状态。此常量与 omrStatus 配合使用,以允许由反应实例的活动实例安全销毁此反应实例。
其定义如下所示:
const long OMRShouldTerminate = 0x00010000L;
GEN
生成新的事件。GEN 宏将使用 gen 方法,然后调用 new 运算符来创建新的事件。
这个宏的定义如下所示:
#define GEN (event) gen (new event)
GEN_BY_GUI
从 GUI 生成事件。GEN_BY_GUI 宏将使用 gen 方法,然后调用 new 运算符来创建新的事件。OMGui 指定 GUI 线程。
这个宏的定义如下所示:
#define GEN_BY_GUI (event) gen ((OMEvent*)
(new event), OMGui)
OMGui 是在 aoxf.h 中定义的。
GEN_BY_X
生成从发送方对象到接收方对象的新事件。这个宏将指定发送方,并且通常用于从外部元素(例如 GUI)生成事件。GEN_BY_X 宏将使用 gen 方法,然后调用 new 运算符(将 sender 作为参数)来创建新的事件。
这个宏的定义如下所示:
#define GEN_BY_X (event, sender) gen (new event,
sender)
GEN_ISR
从中断服务请求 (ISR) 生成事件。GEN_ISR 宏将使用 genFromISR 参数指定为 TRUE 的 gen 方法,以便从 ISR 创建新事件。
将由用户负责分配此事件;GEN_ISR 自身不分配此事件。
这个宏的定义如下所示:
#define GEN_ISR (event) gen (event, TRUE)
对于 VxWorks,GEN_ISR 将生成优先级为“紧急”且放置在事件队列头部的事件。如果在处理第一个事件之前发生另一个来自 GEN_ISR 的事件,那么所发生的事件将放置在前一个事件前面。VxWorks 的 GEN_ISR 实现旨在解决以下用例:反应对象具有“平面”事件流,但有时会收到单个放置在队列头部要立即使用的高优先级事件。
如果系统中突然注入一些 GEN_ISR 事件,那么您可以注释掉框架中的优先级设置,以便使用同等优先级对待来自中断的事件。在 OMBoolean VxOSMessageQueue::put(void* m, OMBoolean fromISR) 中,请注释掉 priority = MSG_PRI_URGENT 这一行。
event
这个公共关系用于指定 OMReactive 实例的活动或当前事件(现在正在处理的事件)。仅当从事件队列中取出事件时,才会指定此关系。
缺省值为 NULL,并且由反应对象的构造函数 OMReactive 指定。
此关系的定义如下所示:
OMEvent *event;
m_eventGuard
此关系与生成的代码配合使用,以防止事件与触发式操作之间以互斥方式使用事件。
如果用户反应类有被守护的触发式操作,那么此关系将设置为该反应类的OMProtected 部分,并且 takeEvent 方法会先锁定该守护,然后再调用 processEvent。
其定义如下所示:
const OMProtected * m_eventGuard;
myThread
这个受保护的关系指定用于将事件放入队列并为反应对象分派事件(以便这些事件在活动类的线程中使用)的活动类。
线程与反应类之间存在单向关系。线程不知道其反应类 - 它可能有多个反应类。但是,反应类与其线程(由 myThread 指定)之间存在关系。
此关系的定义如下所示:
OMThread *myThread;
rootState
此关系用于定义 OMReactive 状态图的根状态(当系统使用的是可复用状态图实现时)。
缺省值为 NULL,并且由反应对象的构造函数 OMReactive 指定。
其定义如下所示:
OMComponentState* rootState;
OMComponentState 类是在 state.h 中定义的。