У меня есть код, который реализует конечный автомат на основе библиотеки Boost MSM. Это работало отлично, пока мне не пришлось добавить строку, которая откладывает внешний интерфейс функтора событий:
Row < StateX, Event1, none, Defer, none >
Теперь, когда этот ряд получает удар, потоки заканчиваются стеком ударов. Я отслеживал вызовы методов в MSM, и, к сожалению, все работает, как задумано Это шаги выполнения:
- process_event вызывается с Event1
- Event1 добавляется в отложенную очередь событий внутри функтора Defer
- , поскольку строка успешно обработана, для обработчика установлено значение ИСТИНА
- в конце process_event есть код для обработки переходов без событий. Этот код необходим, потому что, если событие вызывает переход из состояния A в B, B может иметь автоматический переход в другое состояние, и это единственное место, где они будут обрабатываться (в моем коде я не использую ничего из этого, но логика все еще вызывается)
- eventless_helper вызывает process_event с событием типа «none»
- при обработке «none» (без фактической работы) код теперь видит, что в очереди есть отложенное событие, поэтому он удаляет его из очереди и снова вызывает process_event.
- Теперь мы повторяем все, начиная с шага 1, но мы все еще в функции из предыдущего шага, так что это продолжается до тех пор, пока мы не исчерпаем стек.
Кажется, логика для отсрочки событий вступает в конфликт с логикой для обработки переходов без событий, и мне очень хочется просто перейти к буст-коду и взломать последние. Похоже, что если событие «отклонено», его не следует рассматривать как обработанное, и если бы это было так, переходы без событий не были бы запущены (как они не должны), но тогда конечный автомат оказался бы в вызов no_transition, который по сути является универсальным обработчиком неожиданных ошибок. Это также потребовало бы взлома библиотечного кода, которого я хотел бы избежать.
Но прежде чем я что-то сделаю, я хочу посмотреть, нашел ли кто-нибудь еще это. Или дайте мне совет, где можно получить помощь в этом.
UPDATE:
Судя по всему, версия Boost Library, которую использовала моя компания, была 1.44, и в этой версии была ошибка с отложенной обработкой событий. Это исправлено в 1.46.1.