- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个嵌入式系统软件,我在其中执行一系列硬件初始化步骤,然后根据发生的事件历史记录进入模式 1 或模式 2。即使在某种模式下,我也会根据事件的历史来做某些事情
例如如果我的显示器关闭,那么在模式 1 下,我采用的流程与显示器打开时采用的流程不同。并且显示通知异步到达,我没有显式查询该信息。
几乎没有其他类似的异步到达事件可以改变我将进一步采取的流程。
我试图了解如何存储与过去发生的这些事件相关的信息。我倾向于将它们存储为标志,但这违背了使用状态模式的目的(而且也容易出错)。
我的另一个选择是将这些信息存储在状态本身中,例如Mode1_DisplayOff_Atrribx、Mode1_DisplayOff_Atrribx、Mode2_DisplayOff_Atrribx、Mode2_DisplayOff_Atrriby。但我担心这会使状态机变得复杂。
这里正确的方法应该是什么?
(问题不一定与嵌入式系统相关)
最佳答案
针对这种情况或任何具有复杂状态处理的情况的一般设计建议:
总体设计建议:尽可能简单。力求简单,而不是复杂。
创建一个与您拥有的“模式”、“事件”、“标志”等的组合数量相对应的状态机。这可以根据需要简单或高级 - 有时您可能需要实现子状态(例如在状态“错误”中,有子状态“错误显示”和“错误 adc”等)。
避免旗帜丛林:你必须从众多来源收集旗帜就已经够糟糕的了。如果您还将其与本地决策者结合起来,则必须在整个程序中编写复杂的代码,其中本地决策者会导致状态更改。跟踪程序流程和代码覆盖率很快就会变得不可能。
这也往往会导致许多本来可以相互独立的模块之间紧密耦合,这总是一件非常糟糕的事情。
使用标准错误数据类型(错误编号、错误来源等)为所有状态实现标准化错误处理程序。
将异步信息收集与状态机分开。也就是说,异步事件的发生与程序当前执行的状态无关。如果不这样做,您就必须将它们集成到状态机中。
将下一步行动的决策集中在程序中的一个位置。最好与错误处理程序结合使用。
您的主循环将类似于:
for(;;)
{
state_result = state_machine[current_state]();
event_result = gather_event(); // might need several of these
current_state = evaluate_results (state_result, event_result);
}
其中 evaluate_results
是程序中允许发生状态更改的唯一位置。该函数只关心接下来要执行什么状态,并不执行任何实际工作。
关于c++ - 嵌入式系统状态模式: Storing information related to asynchronous events,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33491078/
当检测鼠标x和y坐标时,最好像这样使用event.clientX和event.clientY: function show_coords(event){ var x=event.clientX;
我有以下代码: document.oncontextmenu = function(evt) { evt = evt || window.event; console.log(evt.
对于另一个问题,我遇到了一个似乎偶尔出现在 SO 的误解。一些提问者似乎认为触发器之于数据库就像事件之于 OOP 一样。 有没有人有一个很好的类比来解释为什么这是一个有缺陷的比较,以及误用它的后果?
$('body').keypress(function(event){ if(event.keyCode == 46){console.log('Delete Key Pressed')};
我正在制作一个“流体”文本区域,它根据内容调整其高度。我实际上正在尝试实现 this脚本。我有以下代码:https://ellie-app.com/Vjtvm6yrKWa1/4 问题是,当增加高度时,
我使用 Raphael .mouseover() 和 .mouseout() 事件来突出显示 SVG 中的某些元素。这工作正常,但在我单击一个元素后,我希望它停止突出显示。 在 Raphael doc
我目前正在开发一个应用程序,允许人们为在线广播电台安排“节目”。 我希望用户能够设置重复事件,例如:- “躁狂星期一”节目 - 每周一 9 点至 11 点“月中疯狂” - 每个月的第二个星期四“本月新
我有以下三个表格(简化版本): 已加载关卡: id(整数、主键、自动增量) globalId(整数,键) 日期(日期时间、键) serverId(Int,键) gamemodeId(Int,Key)
在我阅读 Gevent Tutorial 之后,我有一个关于 gevent.event.Event 的问题。 Event.set() 是否会唤醒所有被 Event.wait() 阻塞的函数? 就像下面
我对 cakephp ver3.1.3 没有经验 我按照说明实现了登录认证功能; http://book.cakephp.org/3.0/en/tutorials-and-examples/blog-
现在,我发送 10 个事件,每个事件有 1 个属性。但是当我想过滤特定事件并按属性选择事件时,在“事件属性”过滤器中仅显示前 7 个事件,而我为其余事件添加的事件仅显示“第一次”过滤器,为什么? 最佳
我不知道我的 Firefox 发生了什么! 我的aspx和javascript代码是这样的: function a() { alert(
中有3个事件fns重装 ,我可以对两者做同样的事情 reg-event-db和 reg-event-fx . reg-event-db之间的主要区别是什么, reg-event-fx和 reg-eve
我遇到了 Firefox keydown 行为,因为在没有聚焦于特定字段的情况下按下 Enter 键(实际上是任何键)不会触发 keydown 事件只会触发`按键事件。 这可能会非常令人困惑,因为 k
这是我的代码片段 public class Notation : INotifyPropertyChanged { public event PropertyChangedEventHandl
我可以在一个 Jsf2 xhtml 文件中有多个标签吗? 在那种情况下,关联的监听器将以什么顺序被调用? Mojarra 2.1.1/Apache Tomcat 7.0.22/PrimeFaces 3
我可以在一个 Jsf2 xhtml 文件中有多个标签吗? 在那种情况下,关联的监听器将以什么顺序被调用? Mojarra 2.1.1/Apache Tomcat 7.0.22/PrimeFaces 3
我有以下 JavaScript: $('#ge-display').click(function (event) { window.open('/googleearth/ge-display.ph
我需要确定触发事件的元素。 使用 event.target 获取相应的元素。 我可以从那里使用哪些属性? 引用 编号 节点名 我找不到关于它的大量信息,即使在 jQuery 上也是如此页,所以希望有人
我在pyGame中创建了一个Asteroidz克隆,并在pygame.vent.get()循环中有两个for Event,一个用于检查退出请求,以及游戏是否应该通过按空格键开始,然后在游戏中进一步尝试
我是一名优秀的程序员,十分优秀!