| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > паттерн для длительных операций с устройством |
| Автор: semibug 12.8.2012, 10:36 |
| Пишу класс, работающий с железкой, набор команд для управления железкой небольшой, и построен по принципу - команда/ответ. Ответ приходит не сразу, мультипоточность по ТЗ запрещена. Соответственно применяю подход с помощью опросов состояния. Например дергаю метод someCmdBegin() с нужными аргументами, затем регулярно проверяю завершение с помощью completed(), и по завершению получаю результаты методом someCmdEnd(). Т.е. для каждой команды есть пара begin(передаем аргументы)/end(получаем результаты). Сей подход кажется громоздким, а задача велосепедной. Подскажите пожалуйста в какую сторону смотреть для улучшения дизайна? |
| Автор: mes 12.8.2012, 10:48 |
| так ответ у Вас же уже есть : методы должны быть для работы с командой, а сама команда представлять пакет данных.. для более точного ответа данных условия недостаточно.. |
| Автор: mabrarov 12.8.2012, 10:49 |
| Посмотрите на Windows IOCP и Boost.Asio. |
| Автор: semibug 12.8.2012, 11:01 |
| Собственно вопрос больше по интерфейсу. Насколько он логичный и интуитивно понятный пользователю класса. Абстрагируясь от этой конкретной задачи, каким может быть интерфейс для класса, выполняющего набор действий, занимающих некоторое время, с условием, что запускать отдельный поток не допускается. |
| Автор: mes 12.8.2012, 11:20 |
| response_one query_one(connection& int, int); a должен ли быть класс ? класс может быть нужен для описания соединения.. также классом может быть обработчик команд.. команды же должны быть свободные для расширения.. |
| Автор: borisbn 12.8.2012, 13:20 | ||
Я бы избавил пользователя от периодического дёрганья completed(). Как-нибудь так (псевдо-код)
Добавлено @ 13:23 хммм. странное требование Добавлено через 5 минут и 7 секунд Если команды могут вызываться пока предыдущая не закончилась, то нужно сделать список таймеров, а не Timer * m_timer; |