使用C ++数据模型与Qt SCXML状态机
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用C ++数据模型与Qt SCXML状态机相关的知识,希望对你有一定的参考价值。
我有一个工作状态机,它从几个州发送类似的消息。目前它们都是硬编码的,所以我的.scxml文件中有片段,如:
<state id="state1">
<transition event="event_1">
<send event="unexpectedEvent1FromState1"/>
</transition>
</state>
和
<state id="state2">
<transition event="event_2">
<send event="unexpectedEventEvent2FromState2"/>
</transition>
</state>
我必须在我的C ++代码中的其他地方捕获多个unexpectedEventXxxxFromYyyy
消息。
我想标准化这些消息,以便我只需在我的代码中捕获一个参数化的unexpectedEvent
信号,它将检查QScxmlEvent对象以找到导致信号发出的转换和源状态。
看了Qt文档后,我相信我需要添加一个数据模型。我不在任何地方使用这些,所以不熟悉。我之前已经相当成功地使用了EcmaScript数据模型进行了实验,但发现当我尝试创建超过150台机器时,应用程序在我的机器上崩溃,显然是因为150+ V8 javascript引擎所需的内存。由于我需要运行1000多个状态机副本,因此排除了EcmaScript数据模型,我需要使用C ++数据模型。
我没有运气,当我第一次实例化的机器首次尝试处理事件时,程序崩溃了。我已经将数据模型中的代码减少到如下所示的最简单的骨骼,并且它仍然崩溃。
请有人告诉我如何使我的数据模型工作?我看过Qt的例子,它们看起来都太微不足道了,有没有人能指出任何更有用的例子?非常感谢。
裸骨代码更改
添加到.scxml文件中的根元素:
datamodel="cplusplus:FooDatamodel:foodatamodel.h"
foodatamodel.h:
#ifndef FOODATAMODEL_H
#define FOODATAMODEL_H
#include "qscxmlcppdatamodel.h"
class FooDatamodel : public QScxmlCppDataModel
Q_OBJECT
Q_SCXML_DATAMODEL
public:
FooDatamodel();
;
#endif // FOODATAMODEL_H
foodatamodel.cpp
#include "foodatamodel.h"
FooDatamodel::FooDatamodel()
免责声明:
- 我在Qt Creator中使用状态机编辑器,我可能在顶部的手写SCXML片段中遗漏了一些重要的东西。我很确定真正的文件在语法和语义上都是有效的 - 虽然上面的
datamodel
属性非常准确。 - 真正的文件名,状态和转换名称是不同的,我可能无法更改上面的C ++片段中的某些内容。真实文件不包含任何实质性代码。
再次感谢,对问题的长度道歉。
万一有人再次来这里......
事实证明,您需要在QScxmlCppDataModel
派生类中使用显式代码将其与状态机关联。这是通过调用QScxmlDataModel::setStateMachine
,将指针传递给状态机实例来实现的。
鉴于这个函数属于我所得到的函数的基类,我感到更加恼火而不是因为我错过它而感到尴尬。因人而异。
对于任何未来的读者,我很抱歉,在提出问题七个月之后,我现在无法构建一个简单的例子来说明所需要的内容。
以上是关于使用C ++数据模型与Qt SCXML状态机的主要内容,如果未能解决你的问题,请参考以下文章