У меня есть работающий конечный автомат, который отправляет похожие сообщения из нескольких штатов. В настоящее время они все жестко запрограммированы, поэтому у меня есть фрагменты в моем файле .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>
и я должен поймать несколько unexpectedEventXxxxFromYyyy
сообщения в другом месте в моем C ++ коде.
Я хотел бы стандартизировать это сообщение так, чтобы мне просто нужно было поймать один параметризованный unexpectedEvent
сигнал в моем коде, который будет проверять объект QScxmlEvent, чтобы найти переход и исходное состояние, которое вызвало испускание сигнала.
Посмотрев документацию по Qt, я считаю, что мне нужно добавить модель данных. Я ими нигде не пользуюсь, поэтому не имею знакомства. Ранее я довольно успешно экспериментировал с моделью данных EcmaScript, но обнаружил, что на моем компьютере происходит сбой приложения, если я пытаюсь создать более 150 машин, по-видимому, из-за памяти, необходимой для более 150 механизмов JavaScript V8. Поскольку мне нужно запустить более 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()
{
}
Отказ от ответственности:
datamodel
атрибут выше довольно точный.Еще раз спасибо, извиняюсь за длину вопроса.
Задача ещё не решена.
Других решений пока нет …