C++ 狂想曲C++;状态图-事件(似乎有效)与触发操作(似乎无效)

C++ 狂想曲C++;状态图-事件(似乎有效)与触发操作(似乎无效),c++,state-machine,rhapsody,C++,State Machine,Rhapsody,我正在使用Rhapsody 8.2.1,只是学习一些基础知识 我让它编译(使用MSVC 2012),生成代码并运行。首先,我有一个类计数器,它有一个属性int m_count,构造函数打印“hello”,状态图有一个状态开始,默认转换到它-默认事务集m_count=3开始::stateEntry()执行的操作printf(“开始-stateEntry m\u计数=%d\r\n”,m\u计数) 因此,接下来我添加了一个计时器事件,它每秒从statestart-->start开始。哪个是m_计数-=

我正在使用Rhapsody 8.2.1,只是学习一些基础知识

我让它编译(使用MSVC 2012),生成代码并运行。首先,我有一个类
计数器
,它有一个属性
int m_count
,构造函数打印“hello”,状态图有一个状态
开始
,默认转换到它-默认事务集
m_count=3
<代码>开始::stateEntry()执行的操作
printf(“开始-stateEntry m\u计数=%d\r\n”,m\u计数)

因此,接下来我添加了一个计时器事件,它每秒从state
start-->start
开始。哪个是
m_计数-=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
  • 一个新的触发操作,名为
    计数器::evTrigger()
    (类计数器的成员)
当我打开转换时,“触发器”默认显示为
evTrigger
——因此我猜它指的是事件,而不是触发的操作

现在我尝试使用它,我将以下代码添加到state
start
的输入操作中:

if (m_count <= 0)
{
    GEN(evTrigger());
}
但是我不能使用为我创建的名为
evTrigger()
的触发操作。为什么不呢? 如果我调用evTrigger()而不是GEN(evTrigger());它会编译,但不会触发事件转换(它会一直向下计数到零以下)。为什么?

然后,我创建两个新项目来分别测试事件和触发操作,并在从
开始
完成
的新转换中使用每个项目,因此有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
}
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...
发电机(evTriggerEvent())-工作:

因此,我的问题是:

  • 为什么ctrl+同时输入事件和触发操作的生成-而简单地和事件将执行相同的工作
  • 触发动作的目的是什么(它不做直觉上应该做的事情)
  • 使用触发动作的正确方法是什么(如果我做错了)
更新

我刚刚注意到——我可以自己创建一个活动。但是当我在转换触发器中使用事件时,会在类操作中自动创建一个触发的操作。。。我不能删除它,因为它正在被使用-现在我更困惑了:(

主要问题是Rhapsody上的文档/示例非常糟糕……大多数论坛都是风滚草,所以这就引出了一个进一步的问题:这是一个死气沉沉的产品还是什么?!

Ctrl+Enter在过渡/状态/任何其他图形元素上键入文本时会让您脱离编辑模式-它不应该创建触发器紧急行动

触发操作是一种同步操作(如原语操作),可能会触发状态机中的转换。这与事件之间的区别在于,当调用触发操作时,它是同步执行的(调用方正在等待状态机中的转换/运行到完成步骤完成)。生成/发送事件时,事件进入事件队列,而调用方(执行GEN调用的调用方)未在等待

调用触发的操作就像调用原语操作一样(例如myInstance->myTrigOp(myArgValue))。触发的操作可以有参数,也可以返回值,但是有一种特殊的方法可以访问参数并从状态机操作设置返回值


如果您想了解有关如何使用触发操作的更多信息,请参阅Rhapsody帮助系统中的触发操作。

谢谢您提供的信息:)“
它不应该创建触发操作
”-但它确实如此!。“
你调用一个触发的操作就像调用一个原始操作一样
”,但在我的例子中,它不起作用——正如我提到的,Rhapsody的“帮助”系统充其量也很差。哦,Rhapsody。我的第一份工作。一滴眼泪顺着我的脸颊流下来。@DanielKamilKozar lol…怀旧的眼泪…还是痛苦?我想是两者的混合。我不喜欢狂想曲本身(实际上鼓励它尽可能地改写RcAPSODE类C++),而且报酬很低,但我学到了很多东西,并与非常有才华的人一起工作。好时光。
start - stateEntry m_count = 3
start - stateEntry m_count = 2
start - stateEntry m_count = 1
start - stateEntry m_count = 0
stateEntry - done!
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...
start - stateEntry m_count = 3
start - stateEntry m_count = 2
start - stateEntry m_count = 1
start - stateEntry m_count = 0
stateEntry - done!