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

Поиск:

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


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


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

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



Код

[quote=boostcoder, 24.2.2011,  02:22, post2304700]можно пример использования?[/quote]
struct talk_canvas // чат
  : gui_frame
{
     talk_canvas (gui_frame * parent, dy::channel& ch) : gui_frame(parent), _channel(ch)
    {
         _table.reg (stc::talk_msg, talk_canvas::&on_msg_enter);

         _channel += _table;
    }
    ~talk_canvas ()
    {
        _channel -= _table; 
    }

    void on_msg_enter (gui_text_enter_event & e) // слот для сообщение от textctrl (строка ввода сообщения)
    {
          _channel << cts::privmsg (_active_target, e.text); // кому и что
          this->show_msg (_active_target, e.text, outgo_color); 
    }
    void on_msg_enter (std::string const& from, std::string const& phrase) // слот для сообщение от dy::channel
    {
          this->show_msg (_active_target, e.text, incom_color); 
    }  
    void show_msg(..) {..}

 private:
     dy::channel  &_channel;
     dy::table _table;
};




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


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


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


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

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



Код

struct distributor 
{
      distributor (dy::channel& ch) : _main_ch(ch)
      {
 // получаем сообщения из основного канала для распределения 
           _main_ch +=  *this; 

 //и позволяем другим каналам сбрасывать сообщения в основной..
           _talk_ch += main_ch;
           _game_ch += main_ch;
      }

      void dispatch(migrant const& m)
      {
           if ( is_for_talk(m.name) ) _talk_ch << m;
           if ( is_for_game(m.name) ) _game_ch << m; 
      }
     dy::channel _main_ch, _talk_ch, _game_ch;  
};


Код

struct main_frame :  gui_frame
{
     main_frame ()    : gui_frame ("app name")
            , _distributor (_channel)
     {
              
          _frame_manager.add_pane ( ..)
          _frame_manager.add_pane ( new _talk_canvas (this, _distributor._talk_ch) );
     } 
     distributor _distributor;
     dy::tcp_channel _channel;
     gui_frame_manager _frame_manager;
};


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


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


pattern`щик
****


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

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



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

в общем выбрал четвертый вариант.
Код


struct global_context {
   db_connection& db;
   logfile& log;
   distributor& distr;
   ....
};

struct type1 {
   type1(logfile& log) {}
   void m1() {}
   void m2(int, double) {}
};

struct type2 {
   type2(logfile& log, db_connection& db) {}
   void m1() {}
   void m2(int, double) {}
};

struct implementation {
   implementation(global_context& context)
      :t1(context.log),
      t2(context.log, context.db)
   {
      reg1 = context.distr.registry(&t1, "type1");
      reg2 = context.distr.registry(&t2, "type2");
      reg1->on(&type1::m1, "m1"); // "type1.m1"
      reg1->on(&type1::m2, "m2"); // "type1.m2"
      reg2->on(&type2::m1, "m1"); // "type2.m1"
      reg2->on(&type2::m2, "m2"); // "type2.m2"
   }

private:
   type1 t1;
   type2 t2;
   registry<type1>::shared_ptr reg1;
   registry<type2>::shared_ptr reg2;
};

...

server<implementation> server(...);



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


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


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

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



Цитата(boostcoder @  24.2.2011,  15:14 Найти цитируемый пост)
но сейчас до этого еще далеко. в данный момент хочу получить стабильную реализацию клиент-серверного взаимодействия.

и с этим шагом еще дальше  smile 


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


pattern`щик
****


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

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



Цитата(mes @  24.2.2011,  16:33 Найти цитируемый пост)
и с этим шагом еще дальше

т.е. клиент-серверное взаимодействие не нужно? не понял...

вопрос по поводу создания на сервере реализаций:
все же, лучше, чтоб сервер получал список типов, и создавал реализации. т.к. при единственной реализации, она будет переполнена.
скажите, каким образом, можно реализовать возможность передать в конструктор одной реализации, ссылку/указатель на другую реализацию? с учетом того, что список реализаций это mpl::vector<>, а создаваться реализации будут при помощи mpl::for_each.

Добавлено через 38 секунд
Цитата(boostcoder @  25.2.2011,  06:00 Найти цитируемый пост)
создаваться реализации будут при помощи mpl::for_each

или, если нужно, можно подумать о другом способе.

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


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


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

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



Цитата(boostcoder @  25.2.2011,  05:00 Найти цитируемый пост)
т.е. клиент-серверное взаимодействие не нужно? не понял...

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


Цитата(boostcoder @  25.2.2011,  05:00 Найти цитируемый пост)
все же, лучше, чтоб сервер получал список типов, и создавал реализации. т.к. при единственной реализации, она будет переполнена.

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

Цитата(boostcoder @  25.2.2011,  05:00 Найти цитируемый пост)
скажите, каким образом, можно реализовать возможность передать в конструктор одной реализации,

Но зачем усложнять себе и другим жизнь ? 




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


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


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

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



открыл новую тему, как ветвь в продолжение этой:
http://forum.vingrad.ru/forum/topic-323593...ed-discoly.html



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


pattern`щик
****


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

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



итак. что имеется на данный момент:
1. клиент-серверная модель.
2. асинхронный вызов.
3. синхронный вызов.
4. использование свойств классов.
5. передача исключений от сервера клиенту.
6. зарезервировано имя реализации "system", в которой пока что присутствует два метода: 1) "help" - выводит информацию о зарегистрированных реализациях, 2) "ping" - время пинга.
7. клиент и сервер переписаны для использования единого пула потоков.
это основное..

написаны декорирующие макросы.

пример демонстрирующий основные возможности:
Код

struct type1 {
   void m1(int v) {
      std::cout << "void type1::m1(" << v << ")" << std::endl;
   }
   int m2(const std::string& s) {
      if ( s != "arg" ) throw std::runtime_error("error!");
      std::cout << "int type1::m2(" << s << ")" << std::endl;
      return 3;
   }
   void m3() {
      std::cout << "void type1::m3()" << std::endl;
   }
   void m4(int v, const std::string& s) {
      std::cout << "void type1::m4(" << v << ", " << s << ")" << std::endl;
   }

   boost::mutex mutex; // для защиты члена
   std::vector<std::string> v;
};

int main() {
   using namespace dy;

   type1 t1; // реализация

   io_service ios(2); // пул потоков

   client client(ios);
   client.connect(...);

   // регистрация. первый способ.
   DECLARE_REGISTRY(type1, reg) = INIT_REGISTRY(client, &t1, "type1", "test type \"type1\""); // декларация объекта регистратора
   REG_METHOD(reg, &type1::m1, "m1", "m1 method description"); // регистрация методов
   REG_METHOD(reg, &type1::m2, "m2", "m2 method description");
   REG_METHOD(reg, &type1::m3, "m3", "m3 method description");
   REG_METHOD(reg, &type1::m4, "m4", "m4 method description");
   REG_PROPERTY(reg, &type1::v , t1.mutex, "v" , "v property description"); // регистрация свойства

   // регистрация. второй способ.
   SIMPLE_SCOPED_REG(type1, &t1, client, "type1", "test type \"type1\"",
      ((&type1::m1, "m1", "m1 method description"))
      ((&type1::m2, "m2", "m2 method description"))
      ((&type1::m3, "m3", "m3 method description"))
      ((&type1::m4, "m4", "m4 method description"))
   );

   // асинхронный вызов
   client.call("type1.m1", 33);

   // синхронный вызов
   client.call<void>("type1.m1", 33);

   // синхронный вызов с возвратом значения
   int res = client.call<int>("type1.m2", "44");

   // асинхронная запись property
   std::vector<std::string> vec = {"1", "2", "3"};
   client.call("type1.v", vec);

   // синхронная запись property
   std::vector<std::string> vec = {"1", "2", "3"};
   client.call<void>("type1.v", vec);

   // чтение property
   vec.clear();
   vec = client.call<std::vector<std::string>>("type1.v");

}


пример с использованием класса и регистрацией себя же:
Код

struct type1 {
   type1(client& cl) {
      CLASS_REG(reg, this, cl, "type1", "test type \"type1\"",
         ((&type1::m1, "m1", "m1 method description"))
         ((&type1::m2, "m2", "m2 method description"))
         ((&type1::m3, "m3", "m3 method description"))
         ((&type1::m4, "m4", "m4 method description"))
      );
   }
   void m1(int v) {
      std::cout << "void type1::m1(" << v << ")" << std::endl;
   }
   int m2(const std::string& s) {
      if ( s != "arg" ) throw std::runtime_error("error!");
      std::cout << "int type1::m2(" << s << ")" << std::endl;
      return 3;
   }
   void m3() {
      std::cout << "void type1::m3()" << std::endl;
   }
   void m4(int v, const std::string& s) {
      std::cout << "void type1::m4(" << v << ", " << s << ")" << std::endl;
   }

   DECLARE_REGISTRY(type1, reg); // объект регистратор, время жизни которого, определяет время действительности регистрации.
};



планы:
1. разобраться с ошибкой: http://forum.vingrad.ru/forum/topic-325353.html
2. уйти от boost.serialization. уж слишком она тяжелая, и добавляет приблизительно 36 байт к бинарному архиву. а с учетом того, что для удаленных вызовов, в основном не используются большие объемы - это недопустимо.
3. написать законченные тесты.
4. выложить на гуглкод

зы
кстати, gcc-4.6.0 зарелизили smile 
http://gcc.gnu.org/gcc-4.6/

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


pattern`щик
****


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

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



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


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


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

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



а где пример вызова ? в том числе и для property.. 

Цитата(boostcoder @  26.3.2011,  12:28 Найти цитируемый пост)
"m4 method description"

 smile a это для чего ? 

Цитата(boostcoder @  26.3.2011,  12:28 Найти цитируемый пост)
уйти от boost.serialization

или просто позволить пользователю выбирать способ конвертации..

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

Добавлено через 44 секунды
тема то продолжает расти  smile 


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


pattern`щик
****


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

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



Цитата(mes @  26.3.2011,  14:05 Найти цитируемый пост)
а где пример вызова ? в том числе и для property.. 

обновил.

Цитата(mes @  26.3.2011,  14:05 Найти цитируемый пост)
a это для чего ?

комментарии к методам/свойствам для "system.help" вызова.

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


pattern`щик
****


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

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



Цитата(mes @  26.3.2011,  14:05 Найти цитируемый пост)
насколько все ж у нас разные взгляд на эту тему, несмотря на столь длительное ее совместное обсуждение.. 

Вы о том, что взаимодействие предполагалось между узлами?

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


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


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

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



Цитата(boostcoder @  29.3.2011,  19:59 Найти цитируемый пост)
Вы о том, что 

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


Добавлено через 2 минуты и 14 секунд
Цитата(boostcoder @  26.3.2011,  12:28 Найти цитируемый пост)
   ((&type1::m1, "m1", "m1 method description"))"
client.call("type1.m1", 33)
// асинхронная запись property
   std::vector<std::string> vec = {"1", "2", "3"};
   client.call("type1.v", vec);





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


pattern`щик
****


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

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




так а что в моей текущей реализации радикально отличается? наличие синхронных вызовов? отсутствие компайл-тайм проверки?

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


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


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

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



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


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


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

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