狂想曲C++状态图 - 事件(似乎有效)与触发操作(似乎什么都不做)
Rhapsody C++ state diagram - event (seems to work) vs triggered operation (seems to do nothing)
我正在使用Rhapsody 8.2.1 - 只是学习一些基础知识。
我让它编译(使用 MSVC 2012),生成代码并运行。首先,我有一个类counter
,其中包含一个属性int m_count
一个打印"hello"的构造函数和一个状态图,其中包含一个状态start
具有默认转换的状态图 - 默认事务集m_count = 3
。start::stateEntry()
操作,printf("start - stateEntry m_count = %drn", 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()
(类计数器的成员)的新触发操作。
当我打开过渡时,"触发器"显示evTrigger in Default
- 所以我想它指的是事件,而不是触发的操作。
现在我尝试使用它,我将以下代码添加到状态start
的入口操作中:
if (m_count <= 0)
{
GEN(evTrigger());
}
在状态done
的输入中,我输入了代码:printf("stateEntry - Done!rn");
好的,所以这有效 - 我得到:
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
- 新触发操作 trTrigger 操作
所以状态图看起来像:
*
| /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 同时生成事件和触发操作 - 当简单地和事件将完成相同的工作时?
- 触发操作的目的是什么(它没有做直觉上应该做的事情)?
- 使用触发操作的正确方法是什么(如果我做错了)?
更新
我刚刚注意到 - 我可以自己创建一个事件。但是当我在转换触发器中使用事件时,会在类操作中自动创建触发操作......我无法删除它,因为它正在使用 - 现在我更加困惑:(
主要问题是狂想曲的文档/示例非常差......大多数论坛都是风滚草,所以这就提出了一个进一步的问题:这是一个死气沉沉的产品还是什么?!
当您在过渡/状态/任何其他图形元素上键入文本时,Ctrl+Enter只会使您退出编辑模式 - 它不应该创建触发操作。
触发操作是可能触发状态机转换的同步操作(如基元操作)。它与事件之间的区别在于,当您调用触发的操作时,它是同步执行的(调用方正在等待状态机中的转换/运行到完成步骤完成)。生成/发送事件时,事件进入事件队列,调用方(执行 GEN 调用的调用方)没有等待。
调用触发操作就像调用基元操作一样(例如 myInstance->myTrigOp(myArgValue))。触发的操作可以有参数,并且可以返回值,但是有一种特殊的方式来访问参数并设置状态机操作的返回值。
如果您想了解更多关于如何使用触发操作的信息,请参考 Rhapsody 帮助系统中的触发操作。
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 此代码中的操作流程是什么?C/C++.
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 对于 CPU 无法原子操作的类型,std::atomic 有什么意义?
- std::atomic_flag不提供加载或存储操作有什么缺点吗?(自旋锁定示例)
- C++中最接近 Lua 表操作的东西是什么?
- 有什么语言可以与C++互操作吗
- 在MySql中使用字符串操作函数有什么问题
- 在 C++ 中,这两种"pointer delete"操作有什么区别?
- 我什么时候需要移动操作,c++
- 如果默认构造函数不执行任何操作,则目的是什么
- 从C++与 C 灵活阵列成员互操作的正确方法是什么?
- 狂想曲C++状态图 - 事件(似乎有效)与触发操作(似乎什么都不做)
- 在C 中操作数据的更好方法是什么
- 在提前操作过程中,对象会发生什么
- 三元操作的结果(类型)是什么
- 嵌入式串行读取操作和桌面PC之间可能有什么区别
- memory_order_seq_cst操作的"happens before"关系和"precedes in a single total order"关系有什么区别?
- Qt 创建者,跟踪:不允许操作.什么是永久解决方案