Использование модели данных 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>

и я должен поймать несколько 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()
{
}

Отказ от ответственности:

  1. Я использую редактор конечных автоматов в Qt Creator и, возможно, я упустил что-то жизненно важное из рукописного фрагмента SCXML вверху. Я уверен, что настоящий файл синтаксически и семантически действителен — хотя datamodel атрибут выше довольно точный.
  2. Реальные имена файлов, имена состояний и переходов различны, и я, возможно, не смог что-то изменить во фрагментах C ++ выше. Настоящие файлы не содержат никакого существенного кода.

Еще раз спасибо, извиняюсь за длину вопроса.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]