OMReactive 类

OMReactive 类是所有反应对象的框架基类,它实现基本事件处理功能。这个类是在文件 omreactive.h 中声明的。

反应对象通常通过状态图或活动图处理事件。反应对象的主要接口有 gentakeTrigger 方法。

触发式操作是影响反应类状态的同步事件。生成的代码将创建一个事件,然后通过调用 takeTrigger 方法将此事件传递给反应类。有关触发式操作的更多信息,请参阅 分派触发式操作

发送方对象应用 gen 方法以将继承 OMReactive 的事件发送给接收方。此事件随后在线程中被放入队列。请参阅生成事件和事件排队

execute 方法等待线程的事件队列。当队列中出现某个事件时,此方法会使用 takeTrigger 方法将该事件分派给适当的 OMReactive 对象。

属性概要
active - 指定反应对象(派生自 OMReactive 的具体对象)是否还是活动对象
frameworkInstance - 指定反应对象是否由框架自身使用(它不是用户定义的对象)
myStartBehaviorEvent - 激活其缺省过渡中包含空过渡的对象
omrStatus - 定义反应对象的内部状态(不是状态图中的用户类状态)
toGuardReactive - 指定使用互斥对象(一个二进制信标)来守护事件使用
常量概要
eventConsumed - 指定已使用事件。
eventNotConsumed - 指定事件已完成,但未被使用
OMRDefaultStatus - 指定 omrStatus 属性的缺省值
OMDefaultThread - 定义 OMReactive 对象的缺省线程
OMRInDtor - 停止事件分派
OMRNullConfig - 确定是否需要在生成的代码中执行空过渡(没有触发器的过渡)
OMRNullConfigMask - 确定 OMReactive 实例是否应在状态机中执行空过渡
OMRShouldCompleteStartBeh avior - 确定在调用 startBehavior 时是否已完成进入状态机,如果未完成,那么确定是否要执行其他空过渡
OMRShouldDelete - 确定当反应对象到达其状态机中的终止接头时,是否被其活动对象删除
OMRShouldTerminate - 允许由反应实例的活动实例安全销毁此反应实例
宏摘要
GEN - 生成新的新
GEN_BY_GUI - 从 GUI 生成事件
GEN_BY_X - 生成从发送方对象到接收方对象的新事件
GEN_ISR - 从中断服务请求 (ISR) 生成事件
关系摘要
event - 指定 OMReactive 实例的活动或当前事件(现在正在处理的事件)
m_eventGuard - 这个宏与生成的代码配合使用,以防止事件与触发式操作之间以互斥方式使用事件
myThread - 指定用于将事件放入队列并为反应对象分派事件(以便这些事件在活动类的线程中使用)的活动类
rootState - 定义 OMReactive 状态图的根状态(当系统使用的是可复用状态图实现时)
构造概要
OMReactive
构造 OMReactive 对象
~OMReactive
销毁 OMReactive 对象
方法概要
cancelEvents
为反应对象取消所有已排队事件。
processEvent
这是主事件使用方法。
discarnateTimeout
销毁反应对象的超时对象。
doBusy
将值设置为 1 或 TRUE
gen
由发送方对象用于将事件发送到接收方对象。
_gen
将发送给反应对象的事件放入队列。
getCurrentEvent
获取当前处理的事件。
getThread
检索与反应对象关联的线程。
handleEventNotConsumed
这是在反应类未使用事件时调用的方法。
handleTONotConsumed
这是在反应类未使用触发式操作时调用的方法。
incarnateTimeout
创建要对反应对象调用的超时对象。
inNullConfig
确定 OMReactive 实例是否应在状态机中执行空过渡(没有触发器的过渡)。
isActive
确定反应对象是否也是活动对象。
isBusy
返回属性的当前值。
isCurrentEvent
确定指定的标识是否是当前处理的事件。
isFrameworkInstance
确定属性的当前值。
isInDtor
确定事件分派是否已停止。
isValid
确保未删除反应类。
popNullConfig
在执行空过渡后使属性递减。
pushNullConfig
对空过渡进行计数并在退出某种状态后使 omrStatus 属性递增。
registerWithOMReactive
将用户实例注册为动画框架中的反应类。
rootState_dispatchEvent
使用实际状态图内的事件。
rootState_entDef
通过执行缺省过渡来初始化状态图。
rootState_serializeStates
这是用于执行实际事件使用的虚方法。
runToCompletion
执行在使用某个事件后可以执行的所有空过渡(如果有)。
serializeStates
将在动画期间调用此方法以发送状态信息。
setCompleteStartBehavior
设置属性的值。
setEventGuard
用于设置事件守护标志。
setFrameworkInstance
更改属性的值。
setInDtor
指定事件分派已停止。
setMaxNullSteps
设置状态图中可以连续执行的最大空过渡数(空过渡是指没有触发器的过渡)。
setShouldDelete
指定当反应对象到达其状态机中的终止接头时,是否被其活动对象删除。
setShouldTerminate
指定反应实例可以被其活动实例安全销毁。
setThread
设置反应对象的线程。
setToGuardReactive
指定属性的值。
shouldCompleteRun
检查值以确定是否有要执行的空过渡。
shouldCompleteStartBehavior
检查启动行为状态。
shouldDelete
确定当反应对象到达其状态机中的终止接头时,是否被其活动对象删除。
shouldTerminate
确定反应实例是否可被其活动实例安全销毁。
startBehavior
在处理任何事件之前,初始化行为机制并执行状态图中的初始(缺省)过渡。
takeEvent
由事件循环(在线程中)用于将反应对象处理变为事件。
takeTrigger
使用触发式操作事件(同步事件)。
terminate
OMReactive 实例设置为终止状态(状态图正进入终止接头)。
undoBusy
sm_busy 属性的值设置为 0 或 FALSE
属性和定义

active

这个受保护属性用于指定反应对象(派生自 OMReactive 的具体对象)是否还是活动对象。活动对象创建自己的线程,并且还继承 OMThread 对象。

缺省值为 0FALSE

如果反应对象是活动对象,那么用户应用程序将调用线程 start;否则,它不会调用此线程。

其定义如下所示:

OMBoolean active;

frameworkInstance

这个受保护属性用于指定反应对象是否由框架自身使用(它不是用户定义的对象)。

缺省值为 0FALSE,并且由反应对象的构造函数 OMReactive 指定。

frameworkInstance 属性可用于根据 Rational® Rhapsody® 框架自身对其进行建模。缺省值为 FALSE;您一般不需要更改缺省值。

其定义如下所示:

OMBoolean frameworkInstance;

myStartBehaviorEvent

这个受保护属性用于激活其缺省过渡中包含空过渡的对象。

其定义如下所示:

OMStartBehaviorEvent myStartBehaviorEvent;

omrStatus

这个受保护属性用于定义反应对象的内部状态(不是状态图中的用户类状态)。

缺省值为 OMRDefaultStatus,并且由反应对象的构造函数 OMReactive 指定。

其定义如下所示:

long omrStatus;

toGuardReactive

这个受保护属性用于指定使用互斥对象(一个二进制信标)来守护事件使用。

缺省值为 0FALSE,并且由反应对象的构造函数 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 参数指定为 TRUEgen 方法,以便从 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 中定义的。


反馈