Я использую Rhapsody 8.2.1 и просто изучаю некоторые основы.
У меня он компилируется (с MSVC 2012), генерирует код и работает. Для начала у меня был класс counter
с одним атрибутом int m_count
с конструктором, выводящим "hello" и диаграмму состояний с одним состоянием start
с переходом к нему по умолчанию - транзакция по умолчанию устанавливает m_count = 3
. start::stateEntry()
действие, которое выполняет printf("start - stateEntry m_count = %d\r\n", m_count);
.
Итак, затем я добавил событие таймера, переходящее из состояния start --> start
каждую секунду. Что делает m_count -= 1
Итак... как и следовало ожидать, когда я запускаю это, я получаю:
start - stateEntry m_count = 3
start - stateEntry m_count = 2
start - stateEntry m_count = 1
start - stateEntry m_count = 0
start - stateEntry m_count = -1
etc...
Теперь я, когда m_count == 0
хочу перейти в новое состояние done
. Поэтому для этого я добавляю новое состояние и соединяю два состояния с переходом состояния, идущим из start --> done
. Я называю переход состояния evTrigger
(как я видел в туториале) и нажимаю ctrl+enter. Это приводит к добавлению:
- Новое событие под названием
evTrigger
- Новая активируемая операция с именем
counter::evTrigger()
(член класса counter).
Когда я открываю переход, «Триггер» говорит evTrigger in Default
— так что я предполагаю, что это относится к событию, а не к запущенной операции.
Теперь я пытаюсь его использовать, я добавляю следующий код в действие входа в состояние start
:
if (m_count <= 0)
{
GEN(evTrigger());
}
А в записи состояния done
ставлю код: printf("stateEntry - Done!\r\n");
Итак, это работает - я получаю:
start - stateEntry m_count = 3
start - stateEntry m_count = 2
start - stateEntry m_count = 1
start - stateEntry m_count = 0
stateEntry - done!
Но я не могу использовать созданную для меня триггерную операцию под названием evTrigger()
. Почему бы нет? Если я вызову evTrigger() вместо GEN(evTrigger()); он компилируется, но переход события не запускается (он продолжает обратный отсчет ниже нуля). Почему?
Затем я создаю два новых элемента для тестирования событий и триггерной операции отдельно, и я использую каждый в новом переходе от start
к done
, поэтому есть 3 перехода с разными триггерами:
- новое событие evTriggerEvent
- новая инициированная операция trTriggerOperation
Итак, диаграмма состояний выглядит так:
*
| /m_count = 3;
|
| +---------+ evTrigger +---------+
+-----> | start |---------------------------->| done |
|---------| |---------|
| | | |
| | trTriggerOperation | |
| |---------------------------->| |
| | | |
| | | |
| | evTriggerEvent | |
| |---------------------------->| |
+---------+ +---------+
| ^
| | tm(1000)/m_count -=1;
+-----+
И действие начала входа выглядит так:
if (m_count <= 0)
{
//GEN(evTrigger()); <----- works
//trTriggerOperation(); <----- appears to do nothing
//GEN(evTriggerEvent()); <----- works
}
Затем я раскомментирую по одному (убедившись, что два других закомментированы) и проверяю их, я получаю следующие результаты (результаты также прокомментированы выше):
GEN(evTrigger()) - Работает:
start - stateEntry m_count = 3
start - stateEntry m_count = 2
start - stateEntry m_count = 1
start - stateEntry m_count = 0
stateEntry - done!
trTriggerOperation() - Не запускает транзакцию...
start - stateEntry m_count = 3
start - stateEntry m_count = 2
start - stateEntry m_count = 1
start - stateEntry m_count = 0
start - stateEntry m_count = -1
start - stateEntry m_count = -2
etc...
GEN(evTriggerEvent()) — работает:
start - stateEntry m_count = 3
start - stateEntry m_count = 2
start - stateEntry m_count = 1
start - stateEntry m_count = 0
stateEntry - done!
Итак, мои вопросы:
- Почему ctrl+enter генерирует как событие, так и триггерную операцию, когда просто и событие выполняют одну и ту же работу?
- Какова цель запускаемого действия (оно не делает того, что интуитивно должно)?
- Как правильно использовать триггерное действие (если я делаю это неправильно)?
Обновить
Я только что заметил - я могу создать событие самостоятельно. Но когда я использую событие в триггере перехода, в операциях класса автоматически создается триггерная операция... Я не могу удалить ее, потому что она используется - теперь я еще больше запутался :(
Основная проблема в том, что документация/примеры по Rhapsody очень плохие... большинство форумов - перекати-поле, поэтому возникает дополнительный вопрос: это мертвый/умирающий продукт или что?!