Как управляются события в QStateMachine?

Я работаю с конечным автоматом на основе QScxmlStateMachine. Некоторые переходы автоматически запускаются кодом в обработчиках onEntry, другие запускаются внешними событиями (например, кликом пользователя).

Выполнение конечного автомата асинхронно. Этот код не блокирует:

m_statemachine->submitEvent("user_initialize", settings);

Отлично. Что я хочу знать, так это то, как тогда выполняется обработка внутри конечного автомата.
Это первое событие ставится в очередь и асинхронно входит в состояние инициализация, а как насчет событий, которые могут быть запущены в этот код состояния onEntry, они тоже поставлены в очередь?
Соответствует ли внутренний цикл событий может обрабатывать некоторые другие события графического интерфейса перед обработкой следующего перехода?
И, я предполагаю, что нет, цикл событий конечного автомата в отдельная ветка?


person ymoreau    schedule 24.08.2017    source источник


Ответы (1)


Это первое событие поставлено в очередь и будет асинхронно входить в состояние инициализации, а как насчет событий, которые могут быть запущены в этом состоянии в коде onEntry, они тоже поставлены в очередь?

Все события поставлены в очередь. Термин Qt для них — опубликованные события (в отличие от отправленных событий, которые выполняются немедленно).

И, я полагаю, что нет, цикл событий конечного автомата находится в отдельном потоке?

Термин «внутренний» цикл событий немного неверен. Конечный автомат действительно работает в цикле событий текущего потока, но копирует некоторые события и обрабатывает их позже.

Может ли внутренний цикл обработки событий обрабатывать некоторые другие события графического интерфейса перед обработкой следующего перехода?

Да. Вам гарантируется только относительный порядок обработки событий внутри самого конечного автомата. Любое количество событий может быть обработано между каждым событием, доставленным в конечный автомат. Это всегда так, независимо от того, какую обработку событий вы выполняете. Единственный способ обойти это — опубликовать события с более высоким приоритетом. Множественные приоритеты событий имеют свои недостатки и должны использоваться с осторожностью и пониманием того, как схема приоритетов реализована в очереди событий.

person Kuba hasn't forgotten Monica    schedule 24.08.2017
comment
Итак, документ: < i>QStateMachine запускает свой собственный цикл обработки событий. это довольно запутанно, ведь невозможно запустить 2 QEventLoop в одном и том же потоке одновременно. Спасибо за ваш ответ, насколько я понимаю, все переходы по умолчанию используют систему событий Qt, а не систему сигналов/слотов, верно? - person ymoreau; 25.08.2017
comment
Это не говорит о том, что он запускает отдельный экземпляр QEventLoop. Он запускает свою собственную очередь событий, цикл слов наверняка немного неправильно используется. Использование системы сигнал/слот является деталью реализации и не представляет интереса для пользователя. Машина реализует семантику UML. Как это сделать, в основном зависит от него. - person Kuba hasn't forgotten Monica; 25.08.2017