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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> удаленный вызов. детали, реализация, архитектура, у темы новое название! 
:(
    Опции темы
mes
Дата 28.10.2010, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  28.10.2010,  12:02 Найти цитируемый пост)

template<typename T, typename C>
struct invoker: i_invoker {
   typedef std::function< void()(T&)> func_t; // пока такой делегат

   virtual void dispatch(constants::header_buffer& h, constants::body_buffer& b) {
      T data;
      deserializer(data, h, b);
      m_func (data);
   }
...

};




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


pattern`щик
****


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

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




я просто не понимаю к чему это должно привести..
может оказаться так, как уже было... что мы четыре страницы не могли понять друг-друга..

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


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


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

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



Цитата(boostcoder @  28.10.2010,  12:18 Найти цитируемый пост)
может оказаться так, как уже было... что мы четыре страницы не могли понять друг-друга..

сейчас так и происходит..поэтому я частями и даю.. smile
ничего скоро уже должно подойти к цели 
smile

Добавлено через 1 минуту и 29 секунд
добавляем к ресиверу функцию (шаблонную) для регистрации обработчика (сейчас лямбда функции)


Это сообщение отредактировал(а) mes - 28.10.2010, 13:22


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


pattern`щик
****


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

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



ага.
Код

/***************************************************************************/

struct i_invoker {
   virtual void dispatch(constants::header_buffer&, constants::body_buffer&) = 0;
};
typedef std::shared_ptr<i_invoker> i_invoker_ptr;

template<typename T>
struct invoker: i_invoker {
   typedef std::function<void(T&)> func_t;

   invoker(func_t& f):m_func(f){}

   virtual void dispatch(constants::header_buffer& h, constants::body_buffer& b) {
      T data;
      deserializer(data, h, b);
      m_func(data);
   }
   func_t m_func;
};

/***************************************************************************/

struct rpc_sender {
   std::function<void(constants::header_buffer&, constants::body_buffer&)> raw_send;
   rpc_sender() {}

   template<typename T>
   void send(const T& o) {
      constants::header_buffer _header;
      constants::body_buffer _body;

      serializer(_header, _body, o);
      raw_send(_header, _body);
   }
};

/***************************************************************************/

struct rpc_receiver {
   rpc_receiver() {}

   void dispatch(constants::header_buffer& h, constants::body_buffer& b) {
      int id = header_coders::decode_header(h).id;
      _map[id]->dispatch(h, b);
   }

   template<typename T>
   void reg(typename i_invoker<T>::func_t& f) {
      _map[T::id] = i_invoker_ptr(new invoker<T>(f));
   }

private:
   std::map<int, i_invoker_ptr> _map;
};

/***************************************************************************/

int main() {
   rpc_sender sender;
   rpc_receiver receiver;

   sender.raw_send = boost::bind(&rpc_receiver::dispatch, &receiver);
}

/***************************************************************************/



Добавлено @ 13:38
код не компилил. так что использовать как псевдокод.

Это сообщение отредактировал(а) boostcoder - 28.10.2010, 13:38
PM WWW   Вверх
mes
Дата 28.10.2010, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



как сделаете заводите два сообщения query и result
и вот тестовый пример :
Код


int main() {
// ....................................................

   rpc_sender client_sender;
   rpc_receiver client_receiver;
  
    client_recevier.set_handler<result> ([](result const&)
    {
         std::cout << "result,  hurra! " << std::endl;
    })
// ....................................................

   rpc_sender  server_sender;
   rpc_receiver server_receiver;

    client_recevier.set_handler<query> ([&client_sender](query const&)
    {
         std::cout << "query.. "
         client_sender.send (result());
    })
// ....................................................

   client_sender.raw_send = boost::bind(&rpc_receiver::dispatch, &server_receiver);
   server_sender.raw_send = boost::bind(&rpc_receiver::dispatch, &client_receiver);

// ....................................................

    client_sender.send (query());

// ....................................................
}


set_handler это reg.


Это сообщение отредактировал(а) mes - 28.10.2010, 13:40


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


pattern`щик
****


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

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



Цитата(boostcoder @  28.10.2010,  13:37 Найти цитируемый пост)
_map[T::id] = i_invoker_ptr(new invoker<T>(f));

тут непонятно что использовать как ключ.. или же эту часть должен сгенерировать кодогенератор?

Добавлено через 1 минуту и 59 секунд
Цитата(mes @  28.10.2010,  13:38 Найти цитируемый пост)
   client_sender.raw_send = boost::bind(&rpc_receiver::dispatch, &server_receiver);
   server_sender.raw_send = boost::bind(&rpc_receiver::dispatch, &client_receiver);

 smile  smile 
PM WWW   Вверх
mes
Дата 28.10.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  28.10.2010,  12:40 Найти цитируемый пост)
тут непонятно что использовать как ключ.. или же эту часть должен сгенерировать кодогенератор? 

T::id .. не понял вопроса.. 
кодогенератора у нас нет пока (мы догаваривались же).. все вручную smile

Добавлено @ 13:43
Цитата(boostcoder @  28.10.2010,  12:40 Найти цитируемый пост)
    


Цитата(boostcoder @  28.10.2010,  12:40 Найти цитируемый пост)
   client_sender.raw_send = boost::bind(&rpc_receiver::dispatch, &server_receiver);
   server_sender.raw_send = boost::bind(&rpc_receiver::dispatch, &client_receiver);
..  smile 
     

что то не так ? 
 smile 

Это сообщение отредактировал(а) mes - 28.10.2010, 13:44


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


pattern`щик
****


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

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



Цитата(mes @  28.10.2010,  13:42 Найти цитируемый пост)
что то не так ? 

все так.
еще одно непонимание разрешилось)
PM WWW   Вверх
mes
Дата 28.10.2010, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  28.10.2010,  12:45 Найти цитируемый пост)
все так.
еще одно непонимание разрешилось) 

отлично smile

Добавлено @ 13:47
как тестовый пример заработает, считайте что главное сделали.
smile

Добавлено через 10 минут и 36 секунд
как закончите выкладывайте этот примерчик на онлайн-компиляторе..
чтоб можно было визуально оценить куда дальше рельсы класть smile


Это сообщение отредактировал(а) mes - 28.10.2010, 13:49


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


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


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

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



чего то долговато.. там вроде ж у Вас все готово.. или опять чего то лишнее прикручиваете ?
 smile 



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


pattern`щик
****


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

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



smile 
вот: http://liveworkspace.org/code/a372e0ad39ad...d988c17158dc121
что-то компилятор ругается..

Добавлено через 13 минут и 9 секунд
не вижу ошибки.. вполне законное связывание..
PM WWW   Вверх
mes
Дата 28.10.2010, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  28.10.2010,  13:45 Найти цитируемый пост)
не вижу ошибки.. вполне законное связывание.. 

это моя ошибка, в связывании забыты плейсхолдеры smile

Добавлено через 2 минуты и 19 секунд
терь не хватает кода сериализации, чтоб увидеть результат.. 
smile



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


pattern`щик
****


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

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



ы)
http://liveworkspace.org/code/3c9e2679054c...56b18c4669b1ff3

Добавлено через 18 секунд
осталось понять почему нет вывода..

Добавлено через 2 минуты и 4 секунды
Цитата(mes @  28.10.2010,  15:03 Найти цитируемый пост)
терь не хватает кода сериализации, чтоб увидеть результат..

это спешка.. сейчас сделаю..
PM WWW   Вверх
boostcoder
Дата 28.10.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



вот: http://liveworkspace.org/code/e41ca2a8c07f...49cabd172c9e0ab

но есть один вопрос не позволяющий завершить код: как быть с meta_dir ? это индикатор направления пакета.

Добавлено через 44 секунды
убрать пока его?

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


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


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

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



Цитата(boostcoder @  28.10.2010,  14:40 Найти цитируемый пост)
но есть один вопрос не позволяющий завершить код: как быть с meta_dir ? это индикатор направления пакета.

ну а откуда он взялся ?  smile   в плане работ его не было smile  smile 
 smile

Добавлено через 19 секунд
сейчас код гляну smile



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

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

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

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

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


 




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


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

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