Использование модели данных 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 двигателей V8 JavaScript. Поскольку мне нужно запустить 1000+ копий конечного автомата, исключена модель данных EcmaScript, и мне нужно использовать модель данных на C ++.

Мне не повезло с этим, и программа вылетает, когда первая машина, которую я создаю, сначала пытается обработать события. Я уменьшил код в модели данных до самых простых костей, как показано ниже, и он по-прежнему падает.

Пожалуйста, кто-нибудь скажет мне, что делать, чтобы моя модель данных работала? Я просмотрел примеры Qt, и все они кажутся слишком тривиальными, чтобы быть полезными, может ли кто-нибудь указать мне на какие-нибудь более мясистые примеры? Большое спасибо.

Изменение кодовых костей

Добавлен в корневой элемент в файле .scxml:

 datamodel="cplusplus:FooDatamodel:foodatamodel.h"

foo #ifndef FOODATAMODEL_H #define FOODATAMODEL_H #include "qscxmlcppdatamodel.h" класс FooDatamodel : public QScxmlCppDataModel { Q_OBJECT Q_SCXML_DATAMODEL public : FooDatamodel (); }; #endif // FOODATAMODEL_H .h:

#include "foodatamodel.h"

FooDatamodel::FooDatamodel()
{
}

foodatamodel.cpp

datamodel

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

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

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

c++,qt,scxml,

0

Ответов: 0

Использование модели данных 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 двигателей V8 JavaScript. Поскольку мне нужно запустить 1000+ копий конечного автомата, исключена модель данных EcmaScript, и мне нужно использовать модель данных на C ++.

Мне не повезло с этим, и программа вылетает, когда первая машина, которую я создаю, сначала пытается обработать события. Я уменьшил код в модели данных до самых простых костей, как показано ниже, и он по-прежнему падает.

Пожалуйста, кто-нибудь скажет мне, что делать, чтобы моя модель данных работала? Я просмотрел примеры Qt, и все они кажутся слишком тривиальными, чтобы быть полезными, может ли кто-нибудь указать мне на какие-нибудь более мясистые примеры? Большое спасибо.

Изменение кодовых костей

Добавлен в корневой элемент в файле .scxml:

 datamodel="cplusplus:FooDatamodel:foodatamodel.h"

foo #ifndef FOODATAMODEL_H #define FOODATAMODEL_H #include "qscxmlcppdatamodel.h" класс FooDatamodel : public QScxmlCppDataModel { Q_OBJECT Q_SCXML_DATAMODEL public : FooDatamodel (); }; #endif // FOODATAMODEL_H .h:

#include "foodatamodel.h"

FooDatamodel::FooDatamodel()
{
}

foodatamodel.cpp

datamodel

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

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

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

00C ++, Qt, SCXML,
Похожие вопросы