Итак, я пытаюсь понять проблему с QStateMachine Qt, и я надеюсь, что кто-то может помочь объяснить, почему это происходит. Меня очень интересует фундаментальное понимание QStateMachine, а не просто исправление.Проблемы с синхронизацией Qt QStateMachine: начальное состояние не установлено на начальном сигнале
Сначала рассмотрим машину состояний с состояниями A, B и событием 1. Событие 1 приводит вас от A до B. A - это начальное состояние.
В частности, это касается поддержания соседей. В устройстве X я получаю сообщение, в котором соседка Y приветствует. Это приводит к тому, что сосед X должен malloc соседний конечный автомат для этого нового соседа Y. Это делает соседний конечный автомат, а затем вызывает QStateMachine :: start();
Теперь, после запуска этого состояния, мне нужно продолжить обработку этого приветственного сообщения. Так что сначала я делал:
Я понимаю, что это не будет работать, потому что запуск является асинхронной вызов и поэтому состояние машина не в ее первоначальном запуске, пока после запуска будет сделано. Это приводит меня к моему первому вопросу.
1) Итак, запуск конечного автомата помещается в очередь событий qapp, но не вызывает асинхронный вызов? Не будет ли событие 1 помещено в очередь событий после начала и, следовательно, это не означает, что мы будем в исходном состоянии? Или это не асинхронный вызов?
Подумав, что это была проблема, я немного изменил свой код, подключив функцию к сигналу запуска конечного автомата. Затем я изменил свой код, чтобы поставить очередь событий, если конечный автомат не запущен, и я обрабатываю эту очередь ожидающих событий (и выдает их на конечный автомат) после вызова начального сигнала.
Ну, оказывается, что начальное состояние STILL не установлено, когда я начинаю сигнал. например QStateMachine :: configuration() .contains (initialstate) == false. Это приводит меня к моему второму и большему вопросу.
2) Почему, когда начальный сигнал испускается, я не в исходном состоянии.
Последовательность событий здесь является:
- Создать государственную машину
- Установить начальное состояние
- Start состояние машины
- Получить событие 1
- Поскольку не началось событие очереди 1
- Начальный сигнал rxed
- Процесс события 1
- Поскольку не неизвестное состояние ничего сделать
- получить событие с 1
- событие процесса 1
- сейчас в состоянии А. перехода в состояние B.
Последовательность должна быть:
- Создать государственную машину
- Установить начальное состояние
- Start состояние машины
- Получить событие 1
- Поскольку не началось событие очереди 1
- Начальный сигнал rxed
- Процесс события 1
- Сейчас состояние А. перехода в состояние B.
- Получить событие 1
- процесса событие 1
- Сейчас состояние B. Ничего не делать.
Или событие лучше, если бы мне не пришлось останавливать мероприятие. Я хотел бы сделать это:
- Создать государственную машину
- Установить начальное состояние
- Start состояние машины
- Получить событие 1
- событие Процесс 1
- Сейчас состояние А. Переход к состояние B.
- Событие приема 1
- Технологическое событие 1
- Теперь состояние B. Не делайте ничего.
Спасибо, что работает как шарм. Я до сих пор не понимаю, почему, когда вызывается начальный сигнал, мы не находимся в исходном состоянии, но, на мой взгляд, это не имеет значения. Очень признателен. –
Я бы не рекомендовал шаблон с помощью qApp-> processEvents().Причина этого заключается в том, что вы не только собираетесь обрабатывать интересующее вас событие, но и все, что есть в очереди, поэтому вам придется обрабатывать дополнительные случаи. Такой вид гнездования никогда не является хорошей идеей ИМО. – mhstnsc