Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> паттерн для длительных операций с устройством 
:(
    Опции темы
semibug
Дата 12.8.2012, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Пишу класс, работающий с железкой, набор команд для управления железкой небольшой, и построен по принципу - команда/ответ.
Ответ приходит не сразу, мультипоточность по ТЗ запрещена.
Соответственно применяю подход с помощью опросов состояния.
Например дергаю метод someCmdBegin() с нужными аргументами, затем регулярно проверяю завершение с помощью completed(), и по завершению получаю результаты методом someCmdEnd(). Т.е. для каждой команды есть пара begin(передаем аргументы)/end(получаем результаты).
Сей подход кажется громоздким, а задача велосепедной.
Подскажите пожалуйста в какую сторону смотреть для улучшения дизайна?

PM   Вверх
mes
Дата 12.8.2012, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



так ответ у Вас же уже есть :
Цитата(semibug @  12.8.2012,  09:36 Найти цитируемый пост)
 и построен по принципу - команда/ответ.


Цитата(semibug @  12.8.2012,  09:36 Найти цитируемый пост)
Например дергаю метод someCmdBegin() 

методы должны быть для работы с командой, а сама команда представлять пакет данных.. 

для более точного ответа данных условия недостаточно.. 



--------------------
PM MAIL WWW   Вверх
mabrarov
Дата 12.8.2012, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 12.1.2011
Где: Казань

Репутация: 8
Всего: 9



Посмотрите на Windows IOCP и Boost.Asio.
PM MAIL WWW Skype   Вверх
semibug
Дата 12.8.2012, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 323
Регистрация: 27.3.2009

Репутация: нет
Всего: нет



Собственно вопрос больше по интерфейсу. Насколько он логичный и интуитивно понятный пользователю класса.
Абстрагируясь от этой конкретной задачи, каким может быть интерфейс для класса, выполняющего набор действий, занимающих некоторое время, с условием, что запускать отдельный поток не допускается.


PM   Вверх
mes
Дата 12.8.2012, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



 response_one query_one(connection& int, int);
Цитата(semibug @  12.8.2012,  10:01 Найти цитируемый пост)
, каким может быть интерфейс для класса, 

a должен ли быть класс ? класс  может быть нужен для описания соединения.. также классом может быть обработчик команд.. команды же должны быть свободные для расширения.. 

Это сообщение отредактировал(а) mes - 12.8.2012, 11:21


--------------------
PM MAIL WWW   Вверх
borisbn
Дата 12.8.2012, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Я бы избавил пользователя от периодического дёрганья completed(). Как-нибудь так (псевдо-код)
Код

class DeviceWrapper
{
public:
   void start( const Parameters & parameters, std::function<void()> callBack, int interval = 42 )
   {
        m_callBack = callBack;
// do some deal with device using parameters
        m_timer = new Timer( interval, std::bind( onTimer, this ) );
   }
private:
   bool completed() { ... }
   void onTimer()
   {
        if ( completed() ) {
             delete m_timer;
             m_callBack();
        }
   }

   std::function<void()> m_callBack;
   Timer * m_timer
};

// usage:
class DevisceUser
{
    void startSomeCommand()
    {
         m_deviceWrapper.start( parameters, std::bind( &DeviceUser::onCommandComplete, this, SomeCommand_ID ) );
    }
    void startOtherCommand()
    {
         m_deviceWrapper.start( otherParameters, std::bind( &DeviceUser::onCommandComplete, this, OtherCommand_ID ) );
    }
    void onCommandComplete( int commandId )
    {
        switch ( commandId ) 
        {
             case SomeCommand_ID:
                 ...
             break;
        }
    }
private:
    DeviceWrapper m_deviceWrapper;
};


Добавлено @ 13:23
Цитата(semibug @  12.8.2012,  10:36 Найти цитируемый пост)
мультипоточность по ТЗ запрещена

хммм. странное требование

Добавлено через 5 минут и 7 секунд
Если команды могут вызываться пока предыдущая не закончилась, то нужно сделать список таймеров, а не Timer * m_timer;

Это сообщение отредактировал(а) borisbn - 12.8.2012, 13:24


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1024 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.