问题标签 [state-machine]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
667 浏览

windows - Windows WorkFlow 线程上的 StateMachine 是否安全?

我打算使用 Windows 工作流的状态机工作流。

状态机将从两个单独的线程接收事件,当然状态机将根据其当前状态和传入的事件更改其状态并执行操作。

我的问题是,windows工作流线程的状态机是否安全,这意味着当两个线程同时访问它时,它会保证正确的状态变化?

0 投票
6 回答
3703 浏览

c++ - 面对非阻塞I/O,如何设计状态机?

我正在使用默认情况下具有非阻塞 I/O 的 Qt 框架来开发一个应用程序,该应用程序在多个网页(在线商店)中导航并在这些页面上执行不同的操作。我正在将特定网页“映射”到我用来浏览此页面的状态机。
这个状态机有这些转换;
Connect, LogIn, Query, LogOut, Disconnect
和这些状态;
Start, Connecting, Connected, LoggingIn, LoggedIn, Querying, QueryDone, LoggingOut, LoggedOut, Disconnecting, Disconnected
从 *ing 到 *ed 状态 ( Connecting->Connected) 的转换是由于在LoadFinished加载当前请求的 url 时从网络对象接收到的异步网络事件。从 *ed 到 *ing 状态 ( Connected->LoggingIn) 的转换是由于我发送的事件。
我希望能够向这台机器发送多个事件(命令)(如 Connect、LogIn、Query("productA")、Query("productB")、LogOut、LogIn、Query("productC")、立即处理它们。我不想阻止等待机器完成处理我发送给它的所有事件。问题是它们必须与上述网络事件交错,通知机器正在下载的 url。没有交错机器就无法推进其状态(并处理我的事件),因为从 *ing 推进到 *ed 只有在接收到网络类型的事件之后才会发生。

如何实现我的设计目标?

编辑

  1. 我正在使用的状态机有自己的事件循环,并且事件没有在其中排队,因此如果机器忙时它们来了,机器可能会错过它们。
  2. 网络 I/O 事件既不会直接发布到状态机,也不会直接发布到我正在使用的事件队列中。它们被发布到我的代码(处理程序)中,我必须处理它们。我可以随心所欲地转发它们,但请记住没有。1.
  3. 看看我对这个问题的回答,我在其中详细描述了我当前的设计。问题是我是否以及如何通过制作它来改进这个设计

    • 更强大
    • 更简单
0 投票
5 回答
3027 浏览

java - java泛型设计问题(状态机)

我制作了一个状态机,并希望它能够利用 Java 中的泛型。目前我没有看到我可以使这项工作并获得漂亮的代码的方式。我确信这个设计问题之前已经被处理过很多次,我正在寻找一些输入。这是一个粗略的轮廓。

每个不同的状态对象(主要是与静态最终变量绑定的匿名类)只有一个副本,它具有每个状态的自定义数据。每个状态对象都有一个状态父级(有一个根状态)

每条消息都是单独创建的,并且每条消息都有自定义数据。它们可以相互子类化。有一个根消息类。

每个处理程序仅创建一次并处理特定的状态/消息组合。

当前跟踪当前状态,以及所有 ( State, Message) ->Handler映射的列表。它还具有其他功能。我试图保持这个类的通用性并使用类型参数对其进行子类化,因为它在我的程序中使用了很多次,并且每次都使用一组不同的Message's / State's / 和Handler's。不同StateMachine的 's 将对其处理程序具有不同的参数。

方法 A

让状态机跟踪所有映射。

允许我为这个特定的状态机自定义处理程序方法。handler.process 方法的参数可以被覆盖。但是,处理程序不能由消息类型参数化。

问题:这涉及instanceof对每个消息处理程序使用健全性检查(确保它正在获取它所期望的消息)。

方法 B

让每个消息处理程序按消息类型参数化

问题:类型擦除会阻止我将这些存储在一个不错的哈希图中,因为所有的MessageHandler' 都会以不同的方式输入。如果我可以将它们存储在地图中,我将无法检索它们并以适当的论点调用它们。

方法 C

让状态对象处理所有消息。

我有与特定状态机状态相关的消息处理程序(通过将它们放入内部),(状态机的每个实例都有自己的有效状态列表),这允许处理程序属于特定类型。(服务器状态机 -> 服务器消息处理程序)。

问题:每个状态只能处理一种消息类型。您也失去了父状态可以处理与子状态不同的消息的想法。类型擦除还可以防止StateMachine调用当前状态处理方法。

方法 D

根据状态自行处理消息。

问题:从来没有真正考虑过,因为每条消息都应该有一个基于当前状态机状态的不同处理程序。发送者将不知道当前StateMachine的状态。

方法 E

用 switch 语句忘记泛型和硬代码状态/消息处理。

问题: 理智

不安全解决方案:

感谢大家的投入,我认为问题是我没有将其简化为好问题(讨论太多),这就是我现在所拥有的。

0 投票
4 回答
1577 浏览

c# - Windows Workflow Foundation 状态机是否适用于高性能场景?

我目前正在处理一个系统,我必须并行跟踪数千个对象的状态,这些对象每分钟发送几次可能的状态更新。此外,我必须执行额外的计算(没有慢 IO 的东西,只使用 CPU)。

我目前使用自定义状态机实现。但是,由于 WF 在系统的其他部分中使用,我想知道 WF 状态机是否适用于具有少数(<5)状态的场景。

我担心在性能方面开销可能太大。由于 MS 文档并没有真正涵盖有关 WF 状态机性能的主题,我想知道一些 SO 成员是否有一些关于 WF 状态机性能的信息或资源?

关于 j。

0 投票
8 回答
143932 浏览

c - 状态机教程

我只是想知道是否有人知道互联网上有一些用于开发状态机的好教程。还是电子书?

我开始在状态机上工作,只需要一些通用的东西来让我开始。

0 投票
6 回答
2285 浏览

c - 大与嵌套状态机

我在一个实时系统中有一个状态机,只有很少 (3) 个状态。

然而,这些状态之间的转换需要相当长的时间并且有自己的细分。所以我有两个选择,或者我扩展主状态机,以便表示所有中间状态:

或者我为相关的主要状态创建一个嵌套状态机:

这两种可能性都有其优点和缺点。大型状态机很容易变得混乱和复杂。然而,在第二种情况下使所有状态保持一致也不是微不足道的,许多函数都需要有关全局状态和子状态的信息。

我想避免必须处理多个并行状态的复杂代码,例如:

解决此类问题的一般最佳方法是什么:许多小型嵌套状态机(具有许多无效组合)、一个大型状态机或其他任何东西?

0 投票
2 回答
1405 浏览

c++ - 状态机实现

我正在寻找一些将军

  1. 优化
  2. 正确性
  3. 可扩展性

关于我当前的 C++ 分层状态机实现的建议。

样本

执行

目前,HSM 被实现为树结构,其中每个状态可以有可变数量的状态作为子状态。

每个状态包含可变数量的覆盖基值的“覆盖”块(在 std::map 中)。在根状态,状态机有一组变量(函数、属性...)初始化为一些默认值。每次我们进入子状态时,“覆盖”列表都会定义变量和值,这些变量和值应该替换父状态中同名的变量和值。为清楚起见,更新了原文。

引用变量

在运行时,当前状态存储在堆栈中。

每次引用变量时,都会执行向下堆栈遍历,以寻找最高覆盖,或者在没有覆盖的情况下,寻找默认值。

切换状态

每次切换到单个状态帧时,该状态都会被压入堆栈。

每次切换到一个状态时,我都会跟踪一个树的下降,它将我从当前状态带到根状态。然后我从目标状态到根状态进行树下降,直到我看到当前跟踪与前一个跟踪匹配。我在这两条迹线相遇的地方声明了一个交叉点。然后,为了切换到目标状态,我从源下降,从堆栈中弹出状态帧,直到到达交点。然后我上升到目标节点并将状态帧推入堆栈。

所以对于上面的代码示例

状态切换的执行跟踪

  • 源状态 = 记录
  • 目标状态 = 也StreamToRemoteIp

  • 从源下降 = 记录->根(跟踪 = [根])

  • 从目标的下降=也StreamToRemoteIp->播放->根(跟踪= [播放,根])

  • 相交于根。

要从录制切换到还StreamToRemoteIp,

  1. 从堆栈中弹出“录音”(并调用其退出函数……此处未定义)。
  2. 将“播放”压入堆栈(并调用 enter 函数)。
  3. 将“alsoStreamToRemoteIp”推入堆栈(并调用 enter 函数)。
0 投票
6 回答
5529 浏览

scala - 有限状态机和 FSM 间信令

对具有本机语言的建议(因此没有 FSM 生成工具)支持状态机开发和执行以及消息/信号的传递。这适用于电信,例如这种复杂程度的 FSM 的实施。

我考虑过 Erlang,但希望得到一些反馈、建议、教程指针、替代方案,尤其是基于 Java 的框架。也许是斯卡拉?

仅开源。我不是在寻找 UML 或正则表达式相关的解决方案。

由于这是为了实现电信协议,FSM 可能并不重要。许多状态,许多转换,基于信号,输入约束/保护。动态实例化将是一个加号。switch 语句是不可能的,它很快就会嵌套到不可用的状态。if/else 稍微好一点。

我宁愿依赖图形设计;FSM 描述的格式应该是人类可读/可编辑/可管理的。

--

我决定专注于基于 Actor 的 C++ 解决方案

例如,Theron 框架提供了一个起点http://theron.ashtonmason.net/并且为了避免在基于 FSM 的事件处理程序中使用 switch 语句,这个 C++ FSM 模板框架看起来很有用http://satsky.spb.ru/articles/ fsm/fsmEng.php

0 投票
3 回答
676 浏览

java - 使用状态机解析 wiki 标记

我想使用状态机解析一个简单的语法,例如 wiki 标记。我从来没有写过或玩过。我想了解如何实现一个简单的。我正在考虑为此使用 Clojure。我的问题是你能给我指出一些很好的教程,这些教程是为这个主题的完整新手准备的,比如我自己吗?

0 投票
1 回答
404 浏览

ruby-on-rails - 如何访问特定 rails 模型的acts_as_state_machine 状态集合?

是否可以访问给定模型的状态集合:

课堂对话包括AASM

结尾

我希望能够获得一系列状态,例如:

这可能吗?