| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Завершение цепочки асинхронных операций |
| Автор: LeonidPr 28.11.2019, 13:48 |
| Данная проблема всплыла в процессе написания десктопного приложения для опроса устройств по ModBus Пока была задача просто опросить регистры, или записать что-то в один из них, проблем не было. Теперь задача усложняется. Пусть есть некая асинхронная операция записи регистра и чтения. Т.е. мы отправляем запрос и дальше занимаемся своими вещами. Когда запрос обработан (неважно таймаут случился, или нормально устройство ответило) поток, обрабатывающий очередь запросов дернет callback. Задача такова, что нужно составлять более сложное действие из таких асинхронных операций (например нужно настроить какой-то функционал в устройстве, записав в разрозненный набор регистров нужные значения). Естественно оно так же должно выполняться асинхронно и по завершении уведомить об успехе или нет. Каждый раз когда пытаюсь что-то такое изобразить все выливается в хардкод какой-то стейт машины, которая по мере завершения элементарных операций переключается между состояниями. В общем не особо гибко. Есть ли какие-то подходы для решения подобных задач (наверняка что-то подобное возникает при работе с БД, когда так же транзакция состоит из нескольких запросов к базе, выполняемых один за другим с контролем успешности)? Может быть какие-то паттерны для асинхронного программирования? |
| Автор: xvr 28.11.2019, 16:10 |
Я бы делал такое на основе графа зависимостей.
|
| Автор: xvr 28.11.2019, 19:29 | ||||
Со стороны запросов это разруливается зависимостями, со стороны ModBus'а - единственным worker'ом для ModBus'а. Т.е. все готовые запросы сваливаются в пул, в который приходят worker'ы, извлекают свои запросы и отправляются их выполнять. Пока запрос не закончился worker за следующим не идёт. Если какая то шина позволяет сделать более одного запроса, для неё заводится несколько экземпляров worker'а
Ошибки тоже могут быть выходными зависимостями. А их обработчики - процедурами с входными зависимостями (типа 'ошибка'). Тогда всё становится одинаковым, для ошибок ничего отдельного делать не надо (за исключением того, что процедуры обработчики ошибок имеют право остаться невыполненными) |
| Автор: LeonidPr 29.11.2019, 15:25 | ||||
Ну да, сейчас так собственно и делается, только Worker пока один.
х-м-м, да, в таком ключе я как-то не подумал, спасибо! |