如果物件是回應的,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 物件的下列起始設定元會呼叫 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 架構中。
起始設定元的第二個參數 p_task,是指向作業的指標,與事件佇列相關聯,回應物件從此事件佇列中處理事件。當回應物件是循序的,則此作業是系統執行緒;當回應物件是作用中,則此作業是物件的執行緒。如需相關資訊,請參閱作用中物件及並行。