回應物件

回應物件是可以接收及處理事件的物件。它們通常有在狀態圖中所定義的狀態型行為。

但是,當物件滿足下列任一項條件時,會將物件視為回應的:

如果物件是回應的,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,是指向作業的指標,與事件佇列相關聯,回應物件從此事件佇列中處理事件。當回應物件是循序的,則此作業是系統執行緒;當回應物件是作用中,則此作業是物件的執行緒。如需相關資訊,請參閱作用中物件及並行


意見回饋