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

Поиск:

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


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


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

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



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

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


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


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


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


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

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



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

модель по первому пункту:
 сеть состоит из узлов-объектов, каждый из которых имеет вход и выход:
Код

concept object
{
    void dispatch(msg const&);
    void (*event)(msg const&);
};

, где msg (сообщение) - полиморфный пакет аргументов (в коде назывался migrant)..

тогда объекты делятся на две условные категории : реализация и канал,
где канал, это частный случай реализации отвечающий за передачу сообщения,
а реализация  это объект исполняющий действие ассоциированное с сообщением.. 
Код

struct tcp_channel // канал
{      
    tcp_channel () {
       _soket .on_read = [&](.. ) 
        {
             ..
             event ( msg(..)  ); 
        };
    }

    void dispatch (msg const& m) { _soket.write ( m );  }
    void (*event)(msg const&);

    tcp_socket _socket;
};

Код

struct client // реализация
{
    void dispatch (msg const& m) { invoke ( _map, this,  m );  }
    void (*event)(msg const&);

    void on_msg1() {
         ..
         event ( msg(..) );
    }
  
   struct map : dy::cls_map<client_impl> 
   {
         map()
         {
              at( msg_type1 ) = &client::on_msg1;
         }
   } static _map;
}

тогда для замыкания клиента на канал, код будет условно таким:
Код


client _client;
tcp_channel  _channel;
dy::connect(_channel, _client); // channel -> client
dy::connect(_client, _channel);  // client -> channel


Добавлено через 11 минут и 58 секунд
Переходим ко второму пункту и начнем с проблем:

мигрант ( для возможности получения контроля в dataflow )
и способ упаковки аргументов/сериализация  (для возможности поддержки существующих протоколов) 
должны задаваться и определяться пользователем .. 

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


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


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


pattern`щик
****


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

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



Цитата(mes @  28.2.2011,  12:31 Найти цитируемый пост)
тема предназначена для обсуждения вопросов возникшей в теме : 
библиотека распределенного общения

цель аргументирована и представлена правильно.

НО:
Цитата

template<typename A1>
struct invoker<void(A1)> : i_invoker

...

template<typename A1, typename A2>
struct invoker<void(A1,A2)> : i_invoker

это сделано только для разного кол-ва аргументов?


Цитата

dy::type<void(std::string, std::string)> welcome;
dy::type<void(std::string)> quit;

как предполагается поступить в том случае, когда у нескольких типов сигнатура одна, а их назначение разное?


Цитата

struct stc {
dy::type<void ( std::string
              , std::string )>     welcome;
                 
dy::type<void ( std::string )>     quit;
    stc () : welcome ({"welcome"})
           , quit({"quit"})
           {}
} _stc;

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


в этой теме:
Цитата

   struct map : dy::cls_map<client_impl> 
   {
         map()
         {
              at( msg_type1 ) = &client::on_msg1;
         }
   } static _map;


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

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


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


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

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



Цитата(boostcoder @  1.3.2011,  14:25 Найти цитируемый пост)
это сделано только для разного кол-ва аргументов?

да.. чтоб получить удобный синтаксис вызова и инвокинга.. 

Цитата(boostcoder @  1.3.2011,  14:25 Найти цитируемый пост)
ак предполагается поступить в том случае, когда у нескольких типов сигнатура одна, а их назначение разное?

написать несколько типов с одной сигнатурой и разным ид 
smile

Цитата(boostcoder @  1.3.2011,  14:25 Найти цитируемый пост)
но это лишний кусок работы возлагаемой на юзера. 

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

Цитата(boostcoder @  1.3.2011,  14:25 Найти цитируемый пост)
у, нужно зарегистрировать объекты-члены client`а?

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




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


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


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

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



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

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

исходя из этого в задачи пользователя входит составление конвертера сырых аргументов в типизированные и обратно.. 
(условно сериализация/десериализация)..

явных дырок вроде не видно..



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


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


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

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



Цитата(mes @  12.3.2011,  23:17 Найти цитируемый пост)
источник - это условный функтор, который из переданного набора типизированных аргументов и собственного id создает сообщение.. 

вот пока прообраз определения отправителя :
http://liveworkspace.org/code/cf501477e6dc...0a837667a76b96f

P.S. то что в namespace dy {} - библиотечные сущности, вне его пользовательские.. 

для того, чтоб было более понятно, добавил client , принимающего испускаемое сообщение..
по сути его (сообщение)  можно как сразу диспатчеризовать как объекту-исполнителю, так и прокси-объекту, например пересылающему каналу..
http://liveworkspace.org/code/f20d825e29ee...b19775061507791


Это сообщение отредактировал(а) mes - 13.3.2011, 20:04


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


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


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

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



дополнил картину условной картой и  зачатком вызова метода :
http://liveworkspace.org/code/3fb0a366fb31...cb548bb3c26dbe5

более полный прообраз dy::map в соседней теме.. 



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


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


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

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



еще немного подправил, убрал лишнее, чтоб  все с одного обзора видно было..
http://liveworkspace.org/code/bc23e9e011e5...76ba0bc2ff9ca5d


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


pattern`щик
****


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

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



mes, скажите, Вы сейчас исследуете связывание со статической проверкой на соответствие?

зы
еще, мне кажется, сильно неудобным такой способ:
Цитата

    _map[_stc.ident] = std::bind(&client::on_ident, this, std::placeholders::_1);
    _map[_stc.quit]  = std::bind(&client::on_quit,  this, std::placeholders::_1);

много ручного кода юзеру писать придется. :(
и "struct stc" тоже ручной код :(

конкретно сейчас, я интегрирую discoly в реальный проект. и тут возникает куча всяких нюансов, которые не видны в тестовом проекте. в общем, все оказывается сложнее чем кажется... и обязанностей у discoly больше, чем просто связывание и вызовы...
PM WWW   Вверх
mes
Дата 17.3.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  17.3.2011,  17:07 Найти цитируемый пост)
Вы сейчас исследуете связывание со статической проверкой на соответствие?

не совсем.. пытаюсь определить такой минимальный каркас,  который будет отражать нужную функциональность.. 

Цитата(boostcoder @  17.3.2011,  17:07 Найти цитируемый пост)
 мне кажется, сильно неудобным такой способ:

ну так сигнал определен как функция, а не как функция объекта.. поэтому и бинд.. 
при использовании cls_map, код инициализации был бы :
Код

    _map[_stc.ident] = &client::on_ident;        
    _map[_stc.quit]  = &client::on_quit;  


Цитата(boostcoder @  17.3.2011,  17:07 Найти цитируемый пост)
и "struct stc" тоже ручной код 

а тут что смущает ?  что приходится тип и имя задавать ? а на что опираться контролю типобезопасности ?
к тому же в любом случае должны быть определены две функции/функтора : отправитель и приемник.. 




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


pattern`щик
****


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

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



Цитата(mes @  17.3.2011,  18:28 Найти цитируемый пост)
а на что опираться контролю типобезопасности ?
к тому же в любом случае должны быть определены две функции/функтора : отправитель и приемник..

это я понимаю. просто мысль высказал smile

и еще. для чего _stc является глобальным объектом? это обязательно? почему?
PM WWW   Вверх
mes
Дата 17.3.2011, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(boostcoder @  17.3.2011,  17:31 Найти цитируемый пост)
и еще. для чего _stc является глобальным объектом? это обязательно? почему?

пока просто.. 
а так из предположения, что в один момент может существовать только один sender::call с одним имен..

Добавлено через 10 минут и 33 секунды
Цитата(boostcoder @  17.3.2011,  17:07 Найти цитируемый пост)
 и обязанностей у discoly больше, чем просто связывание и вызовы... 

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




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


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


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

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



Цитата(boostcoder @  17.3.2011,  17:07 Найти цитируемый пост)
и "struct stc" тоже ручной код :(

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

struct stc : dy::sender<traits> {
   call<std::string> ident;
   call<std::string> quit;
} _stc;

а счетчик на каждый Тraits  будет свой, для исключения конфликтов между разными протоколами..
также у пользователя должна быть возможность определить принцип построения ид, например добавить префикс..
итого :
http://liveworkspace.org/code/8934bc564df5...bb91362ac1f5376

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


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


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


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

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



Цитата(mes @  21.3.2011,  08:50 Найти цитируемый пост)
итого :

из за статического счетчика,  при создании двух экземпляров stc элементы получат разные id..
а также нет контроля выхода за пределы позволенной енумерации.. 
решить проблемку можно двумя способами.. 
1. сделать stc синглетоном
2. задавать при создании группы (stc) возможный  диапазон значений..
вот в грязном виде :
http://liveworkspace.org/code/c09a3d8b8c97...3f6c4dfdd44114f

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

Добавлено через 2 минуты и 56 секунд
только мне названия ни sender, ни call не нравятся.. 



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


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


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

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



Цитата(mes @  17.3.2011,  17:28 Найти цитируемый пост)
ну так сигнал определен как функция, а не как функция объекта..

опробуем "превращение" функции, в функцию-член :
http://liveworkspace.org/code/5e6c6afcb028...ee90364f5ab5631

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


--------------------
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.1187 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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