그러나 오브젝트가 다음 조건 중 하나를 충족하는 경우에 반응한다고 간주됩니다.
오브젝트가 반응 오브젝트인 경우 오브젝트에 대한 구조에서 RiCReactive 오브젝트가 값을 기준으로 데이터 멤버로서 임베드됩니다. 예를 들면, 다음과 같습니다.
typedef struct Furnace Furnace;
struct Furnace {
RiCReactive ric_reactive;
/* attributes of Furnace */
};
RiCReactive는 반응 오브젝트의 이벤트 처리 동작을 정의하기 위해 IBM® Rational® Rhapsody® Developer for C 프레임워크에서 제공되는 추상 데이터 유형입니다.
모든 반응 오브젝트에 대해, 상태 차트 구현의 일부로 정의된 함수에 대한 포인터를 보유하기 위해 구현 파일에 추가 struct가 정의됩니다. 이 포인터는 오브젝트 유형의 반응 멤버로 전달됩니다.
static const RiCReactive_Vtbl Furnace_reactiveVtbl = {
rootState_dispatchEvent,
rootState_entDef,
ROOT_STATE_SERIALIZE_STATES(rootState_serializeStates),
/* Violation of MISRA Rule 45 (Required): */
/* 'Type casting to or from pointers shall not be used.' */
/* The following cast is justified and is */
/* for Rational Rhapsody auto-generated code use only. */
(RiCObjectDestroyMethod) Furnace_Destroy,
NULL,
NULL,
NULL,
(RiCObjectCleanupMethod) Furnace_Cleanup,
(RiCObjectFreeMethod) FreeInstance
};
다음에 유의하십시오.
dispatchEvent(), entDef() 및 serializeState() 함수는 프레임워크(RiCHdlCls.c)에서 정의된 핸들 클로저 파일에서 구현됩니다. 유사한 태스크를 수행하고 원하는 경우 가상 함수 테이블을 통해 이 태스크를 프로젝트에 링크하기 위한 함수를 정의할 수 있습니다. 그러나 이는 주제 범위를 벗어납니다.
반응 오브젝트와 이 반응 오브젝트가 구동하는 상태 차트의 초기화는 오브젝트에 대한 초기화 함수의 일부로 완수됩니다. 예를 들어, HomeHeatingSystem에서 Furnace 오브젝트에 대한 다음 초기자(initializer)는 RiCReactive_init()를 호출하여 반응 오브젝트를 초기화한 후 initStatechart()를 호출하여 오브젝트에 대한 상태 차트를 초기화합니다.
void Furnace_Init(Furnace* const me, RiCTask * p_task) {
RiCReactive_init(&me->ric_reactive, (void*)me,
p_task, &Furnace_reactiveVtbl);
/* relation initialization loop */
initStatechart(me);
}
RiCReactive_init() 및 initStatechart() 함수는 Rational Rhapsody 프레임워크에서 정의됩니다.
초기자(initializer)에 대한 두 번째 매개변수 p_task는 반응 오브젝트가 이벤트를 처리하는 태스크(연관된 이벤트 큐가 있는)에 대한 포인터입니다. 반응 오브젝트가 순차적인 경우 이 태스크는 시스템 스레드이고, 반응 오브젝트가 활성 상태이면 이 태스크는 오브젝트의 스레드입니다. 자세한 정보는 활성 오브젝트 및 동시성의 내용을 참조하십시오.