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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RE: библиотекa распределенного общения, вопросы, предложения и обсуждение 
:(
    Опции темы
boostcoder
Дата 25.3.2011, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(mes @  25.3.2011,  20:48 Найти цитируемый пост)
еще немного дополнил :
http://liveworkspace.org/code/989c8c8da555...522627c428c0eab

с одной стороны, радует компайл-тайм проверка на соответствие сигнатур/типов.
с другой стороны, сложность в использовании...

Вы сами-то как считаете, дай Вам такую библиотеку, Вы бы ее с удовольствием использовали?
не примите как критику.

у меня сложилось два варианта:
1. использовать так, как я предложил.
2. писать кодогенератор.

Добавлено @ 21:55
Цитата(mes @  25.3.2011,  20:48 Найти цитируемый пост)
1. как минимальными действиями для пользователя позволить ему проинициализировать карту методов.. 

это хороший вопрос...

Цитата(mes @  25.3.2011,  20:48 Найти цитируемый пост)
2. как проинвокить tuple стандартными средствами..

что имеется ввиду?

Добавлено @ 21:59
Цитата(boostcoder @  25.3.2011,  21:54 Найти цитируемый пост)
2. писать кодогенератор.

наверное это самый оптимальный вариант.
ибо можно разработать синтаксис, простой и понятный пользователю, и многое возложить на кодогенератор(проверку соответствия типов/сигнатур, объединение, групировку, условный инвок, и т.д..).

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


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


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

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



Цитата(boostcoder @  25.3.2011,  20:54 Найти цитируемый пост)
Вы сами-то как считаете, дай Вам такую библиотеку, Вы бы ее с удовольствием использовали?

То в ту сторону ее я тяну, как раз и соответствует моим пожеланиям.. smile

Цитата(boostcoder @  25.3.2011,  20:54 Найти цитируемый пост)
с одной стороны, радует компайл-тайм проверка на соответствие сигнатур/типов.
с другой стороны, сложность в использовании...

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

а вот насчет сложности, я не вижу никакой излишней.. 
и в частности того, чего нельзя было бы замакросить в дальнейшем для большего удобства.. 

если речь идет о лишнем описании сигналов (stc) , то фактически оно не является лишним..
так и так нужно было написать две функции, одну отправляющую сигнал, другую принимающую.. Во вторых stc является библиотекой, по отношению к коду приемки..
т.е. соблюдается соотношение один к несколько.. 

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

Добавлено @ 22:35
Цитата(boostcoder @  25.3.2011,  20:54 Найти цитируемый пост)
 писать кодогенератор.

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

Добавлено @ 22:46
Цитата(boostcoder @  25.3.2011,  20:54 Найти цитируемый пост)
что имеется ввиду?

передать содержимое std::tuple в std::function..

Добавлено @ 22:49
еще насчет сложности.. если мы будем рассматривать общий случай, когда мы можем использовать дефолтные сообщение и ее свойства, то пользовательский код по определению реализации будет выглядеть так
Код

// протокол
struct stc : dy::proto<> {
   stc () : proto_t (10,12) {} 
   
   call<std::string> ident;
   call<std::string> quit;
         
} _stc;


Код

// реализация обработчика
struct client : dy::class_<client>
{
   void on_ident (const std::string&) { std::cout << "on_ident "; }
   void on_quit  (const std::string&) { std::cout << "on_quit "; }
};
//<--
//строка_инициализации_карты ()
( _stc.ident, &client::on_ident )
( _stc.quit,  &client::on_quit );

что можно еще принципиально упростить в этом примере, я не вижу.. 

Это сообщение отредактировал(а) mes - 25.3.2011, 23:01


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


pattern`щик
****


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

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



Цитата(mes @  25.3.2011,  22:34 Найти цитируемый пост)
struct client : dy::class_<client>

еще один момент, который в моем случае препятствует использованию вашего способа в моем проекте - это наследование от шаблона.
дело в том, что в моем проекте, GUI уже написан. и написан он с использованием Qt. а Qt, как известно, имеет один неприятный нюанс - запрещено наследоваться от шаблонов. т.е. класс, который предоставляет сигналы и слоты, и соответствует концепту QObject - не может наследовать шаблонный класс. это ограничение навязывает их метагенератор(moс).
т.е. в вашем случае, не получится напрямую отразить Qt`ешный класс на протокол...
PM WWW   Вверх
mes
Дата 26.3.2011, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  26.3.2011,  16:53 Найти цитируемый пост)
наследование от шаблона

наследование совершенно не обязательно.. 
можно проксировать, а можно просто замакросить определение оператора() и вспомагателей..

Добавлено через 2 минуты и 8 секунд
добавил инвокинг, и условную конвертацию (аналог сериализации) (пока в грязном виде)
http://liveworkspace.org/code/85c953df7972...a1a795ea3091739


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


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


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

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



вот убрал наследование, а также добавил условное namespace dyco, в который поместил ступень описания протокола...
http://liveworkspace.org/code/95331fe1e1a9...fc253af093dee5c

итого имеем три ступени :
:: dy     - общие элементы обеспечения взаимодействия
:: dyco - описание конкретного протокола
::         - клиентская приложение

Это сообщение отредактировал(а) mes - 26.3.2011, 23:42


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


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


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

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



как уже говорилось, есть два основных действия над сообщением
1. передача (предположительно посредством каналов)
2. исполнение (как вызов функции свободной или члена)

со вторым пунктом более-мене разобрались, переходим к разбору первого..
вот с наброском канала :
http://liveworkspace.org/code/3d24f56e14ba...4b30929fcaf7079



 


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


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


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

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



набросал условный пример взаимодействия двух объектов.. 
http://liveworkspace.org/code/c4deb105acd2...586886857f0fa11

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



Это сообщение отредактировал(а) mes - 27.3.2011, 14:30


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


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


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

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



вернем тему к жизни smile Пришло немножко вдохновения, решил попробовать заново :
http://liveworkspace.org/code/4616ac827fa4...62f02cf81ec1509

так выглядит условный калькулятор : 
Код

namespace math_face {
  
dy::msg_type<int, int> do_add = { "math.do_add" };
dy::msg_type<int>      re_add = { "math.re_add" };
  
}

struct math_client 
{
  math_client (dy::channel & ch)
     : _channel (ch)
     , _my_name ("math_client")
     , _service_name ("math_service")
  {
  }

  void add (int a, int b)
  {

     _cxt_for_add.a = a;
     _cxt_for_add.b = b;
     
     send (math_face::do_add(a,b));
  }
  
  void re_add (const dy::msg&, int c)
  {
  
     std::cout << ":=> " << _cxt_for_add.a <<" + " <<  _cxt_for_add.b;   
     std::cout << " = " << c;           
  }
  

protected:  

  void send (dy::content const& c)
  {
        _channel.send (_my_name, _service_name, c ); 
  }
  
private:
  dy::channel & _channel;  
  std::string   _my_name;   
  std::string   _service_name;  
  
  struct cxt_for_add { int a, b; } _cxt_for_add;
  
};

struct math_service 
{
  math_service(dy::channel & ch)
     : _channel (ch)
     , _my_name ("math_service")
  {
  }
  
  void do_add (const dy::msg & m, int a, int b)
  {
     _channel.send (_my_name, m.sender_id, math_face::re_add (a+b) ); 
  }
  
  dy::channel & _channel;  
  std::string   _my_name;   
};

int main ()
{
   dy::channel _chan;
   dy::msg_logger  _logger; 
   dy::distributor _distributor;
   
   _chan._receptors.push_back(&_logger);
   _chan._receptors.push_back(&_distributor);   
   
   math_client _client(_chan);
   math_service _service(_chan);

   _distributor.add_method(math_face::re_add,  dy::make_method (&_client,  &math_client::re_add));     
   _distributor.add_method(math_face::do_add,  dy::make_method (&_service, &math_service::do_add));
 
   
   _client.add (29, 47);
        
}



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


pattern`щик
****


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

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



по крайней мере для меня, задача считается решенной, ибо решение успешно используется уже в нескольких проектах. в Вашем примере все как-то слишком сложно.
пример:
Код

// исходный класс
struct calc {
   void add(int a, int b) {}
   void sub(int a, int b) {}
};

// использование
calc c;
c.add(2,3);
c.add(4,5);

необходимо дополнить этот код так:
Код

// общий для всего приложения
distributor distr;
// регистратор для математического сервиса
object_registry reg = distr.get_registry("math::calc");
// регистрируем процедуры
reg.on("add", &calc::add);
reg.on("sub", &calc::sub);
// вызов
distr.invoke(...);

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

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


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


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

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



Цитата(boostcoder @  11.8.2012,  08:54 Найти цитируемый пост)
reg.on("add", &calc::add);
reg.on("sub", &calc::sub);

тут нет гарантии типо-безопасности... без нее задача естественно легче решаема и в текущей ситуации мне неинтересна.. smile


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


pattern`щик
****


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

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



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

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


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


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

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



Цитата(boostcoder @  11.8.2012,  09:12, пост2510858)
гарантии я получаю путем использования общих интерфейсов на обоих сторонах.
другого, внятного и удобного способа получить эти гарантии - нет.

для вас интерфейс это концевые обьекты реализующие функциональность, для меня  простое согласование имен с их типами, а именно : 

Код

namespace math_face {
  
dy::msg_type<int, int> do_add = { "math.do_add" };
dy::msg_type<int>      re_add = { "math.re_add" };
  
}
.. 
.. math_face::do_add(a,b); // формирование вызова удаленной фукции 

что грубо соответсвует :
Код

namespace math_face {
struct do_add {
   virtual void do_add(int,int) =0;
};
struct  re_add {
  virtual void re_add(int)=0;
};

}


в "классическом"стиле букв еще больше smile

Это сообщение отредактировал(а) mes - 11.8.2012, 10:37


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


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


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

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



цледующий шаг,подключил сигналы :
http://liveworkspace.org/code/b69e0a200b84...ef4474cabcbcb37

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



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


pattern`щик
****


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

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



Цитата(mes @  11.8.2012,  10:32 Найти цитируемый пост)
в "классическом"стиле букв еще больше

но зато только одна точка задающая соответствия.

Цитата(mes @  11.8.2012,  12:33 Найти цитируемый пост)
цледующий шаг,подключил сигналы :

непонимаю цели. т.е. в чем профит?

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


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


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

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



Цитата(boostcoder @  11.8.2012,  12:21 Найти цитируемый пост)
но зато только одна точка задающая соответствия.

одна при декларации интерфейса и вторая при определении наследника..

Добавлено @ 15:56
Цитата(boostcoder @  11.8.2012,  12:21 Найти цитируемый пост)
непонимаю цели. т.е. в чем профит?

не понял...
я предполагаю два demuxa : один сигнальный, другой функциональный.. если не нравится - можно самому переопределить рецептор.. пример обработки сообщения без его конкретизации - логгер - ему demux совсем ненужен..

Добавлено @ 15:57
Цитата(boostcoder @  11.8.2012,  12:21 Найти цитируемый пост)
. т.е. в чем профит?

вопрос, почему оставляю доступ к сигналу ? чтоб не прятать привычный интерфейс..

Добавлено @ 16:01
концепция : есть канал, на вход скидываются сообщения, на выходе получаются и если нужно демультипликсируется.. все  что снаружи от этой области в компентенции юзера.. 
канал можно будет замыкать  на другой канал или на сокет, для трансляции сообщений за пределы приложения.. также можно устанавливать фильтры для разветвления потока сообщений...

Это сообщение отредактировал(а) mes - 11.8.2012, 16:03


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0617 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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