gpt4 book ai didi

c++ - Rhapsody C++ 状态图 - 事件(似乎有效)vs 触发操作(似乎什么都不做)

转载 作者:搜寻专家 更新时间:2023-10-31 01:29:55 25 4
gpt4 key购买 nike

我正在使用 Rhapsody 8.2.1 - 并且只是在学习一些基础知识。

我让它编译(使用 MSVC 2012),生成代码并运行。首先,我有一个类 counter,它有一个属性 int m_count,它有一个打印“hello”的构造函数,还有一个状态图,只有一个状态 start使用默认转换 - 默认事务设置 m_count = 3start::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 类的成员)。

当我打开转换时,“Trigger”显示 evTrigger in Default - 所以我猜它指的是事件,而不是触发的操作。

现在我尝试使用它,我将以下代码添加到状态start的入口 Action 中:

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());它编译但事件转换不触发(它一直倒计时低于零)。为什么?

然后我制作了两个新项目来分别测试事件和触发操作,我在从 startdone 的新转换中使用每个项目,所以有 3 个不同的转换触发器:

  • 新事件 evTriggerEvent
  • 新的触发操作 trTriggerOperation

所以状态图是这样的:

*
| /m_count = 3;
|
| +---------+ evTrigger +---------+
+-----> | start |---------------------------->| done |
|---------| |---------|
| | | |
| | trTriggerOperation | |
| |---------------------------->| |
| | | |
| | | |
| | evTriggerEvent | |
| |---------------------------->| |
+---------+ +---------+
| ^
| | tm(1000)/m_count -=1;
+-----+

开始入口 Action 是这样的:

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 上的文档/示例非常糟糕......大多数论坛都是风滚草,所以这带来了一个进一步的问题:这是一个死的/垂死的产品还是什么?!

最佳答案

Ctrl+Enter 当您在过渡/状态/任何其他图形元素之上键入文本时,只会让您退出编辑模式 - 它不应该创建触发操作。

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

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

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

关于c++ - Rhapsody C++ 状态图 - 事件(似乎有效)vs 触发操作(似乎什么都不做),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49009603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com