Синхронизировать QStateMachine

У меня есть класс, внутреннее состояние которого определяет макет в файле QML. Теперь это внутреннее состояние в основном определяется конечным автоматом. Однако часть этого не определяется конечным автоматом, а вместо этого полагается на другие переменные-члены, которые должны быть установлены. У меня следующая ситуация:

void foo()
{
   emit stateChange1();
   ...
   mMember = true;
}

Вот stateChange1() может изменить состояние конечного автомата, что приведет к изменениям в qml). mMember напрямую меняет qml. Теперь моя проблема заключается в том, что крайне важно обрабатывать (возможные) изменения состояния, подразумеваемые statechange1() до изменения состояния, подразумеваемого настройкой mMember, Однако, поскольку QStateMachine работает асинхронно, я не могу этого гарантировать. Есть ли элегантные решения для этой проблемы?

1 ответ

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

Используя код из этого ответа, преобразуйте код следующим образом:

template <typename F>
static void postToStateMachine(F && fun, QStateMachine * sm) {
   sm->postEvent(new detail::FEvent<F>(std::forward<F>(fun)));
}

void Class::foo() {
  emit stateChange1();
  ...
  postToObject([this]{ mMember = true; }, this);
  // or
  postToStateMachine([this]{ mMember = true; });
}
Другие вопросы по тегам