crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Архитектурный вопрос
Введите ваше имя
Подтвердите код

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

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Iron Bug Дата 27.3.2013, 19:37
 
Цитата(lanz @ 27.3.2013, 17:43) *
Как кстати насчет Dbus/COM, ни у кого не было опыта использования?

c COM одно время дело имела - это было наследние тех, кто писал проект до меня. не понравилось просто ужасно. может, на С# или каком-нить вижуал бейсике это выглядит проще, но на С++ под него писать очень сложно, особенно если ты не потребитель ресурсов, а сам что-то предоставляешь. потом, регистрация объекта - дело довольно геморное. юзать COM можно, но удовольствия это не доставляет.
мне вообще кажется, что последние годы мелкософт хочет отойти от COM и "неуправляемых" (native) приложений. я даже подозреваю их в том, что они из-за этого не хотят развивать и поддерживать компилятор С++. может, это паранойя, но как-то так это выглядит.
Алексей1153 Дата 27.3.2013, 18:21
  lanz, ну тут, само собой, лучше оставить лазейку для передачи прямого пакета.

Цитата(lanz @ 27.3.2013, 17:43) *
Как кстати насчет Dbus/COM, ни у кого не было опыта использования?

у меня нет
lanz Дата 27.3.2013, 14:43
  Графики кривых, 5-10К точек, хотелось бы хотябы 10-15 в секунду, локально естественно. Не локально я думаю раз-два в секунду где-то.
XML/JSON/сжатие-растяжение кажется тяжеловато будет.

Я тут глядел на камеры которые через Ethernet работают. Там все здорово аж до 30 fps, но они свои драйвера рекомендуют ставить и выделенную сетевуху, так что мне кажется становится тесновато для просто лобового подхода.

Надо пробовать в общем :lol:

Городить последнее дело, понятно, вот если взять готовый...
Как кстати насчет Dbus/COM, ни у кого не было опыта использования?
Алексей1153 Дата 27.3.2013, 13:51
  lanz, а где, что и в каких объёмах будет гоняться ? От этого зависит

если это НЕ локалка, то можно составлять XML или JSON (он полегковеснее), ужимать стандартным
QByteArray qCompress ( const QByteArray & data, int compressionLevel = -1 )

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

Городить двоичные протоколы - фу фу, пройденный этап ) Потом в определённый момент заколебает несовместимость

если это всё локально, то и без сжатия будет летать. Ну там тесты и покажут
lanz Дата 27.3.2013, 13:45
 
Цитата
делай для этого отдельный быстрый метод без текста.


В итоге на этом и остановился.

Хочется чтобы потом легко распилилась программа на клиент-сервер.
Кстати какие лучше протоколы городить чтобы потом на TCP хорошо легло?
Свой придумывать с текстовыми командами + сегментами данных или ориентироваться на COM/Dbus, protobuf например?
Стоит ли морочится с TCP или сразу лучше взять zmq?
Алексей1153 Дата 27.3.2013, 13:21
 
Цитата(lanz @ 27.3.2013, 11:39) *
стати насчет массивов данных, что тут лучше, base64? Нормально будет для объемов до 500Кб?
А то что то меня душит, непойму что


жабу не слушай, делай строку хексов 00112233AAFF , а то на конвертации потратишь больше ресурсов )
500 кб - фигня для нечастых обменов

если же всё столь специфично, что нужно часто передавать массивы, то делай для этого отдельный быстрый метод без текста.
Iron Bug Дата 27.3.2013, 10:53
 
Цитата(lanz @ 27.3.2013, 11:39) *
Насколько я понимаю, в старом std/tr1 так не получится или я что-то упустил?

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

тут главная проблема - это разные представления "указателей" на методы классов. на самом деле, это нифига не указатели, а сложные структуры, которые не стандартизованы и у каждого компилятора они свои и даже меняются от версии к версии внутри одного компилятора. поэтому делегирование методов комитет по стандартизации переложил на разработчиков стандартных библиотек, идущих вместе с компилятором, что вполне логично. чистого делегирования в С++ нет, зато есть связывание, которое заменяет делегирование на практике.
lanz Дата 27.3.2013, 8:39
 
Цитата
Вот, по-быстрому написала


Настоящая черная магия :lol:
Супер, спасибо!

Насколько я понимаю, в старом std/tr1 так не получится или я что-то упустил?

Цитата
lanz, все названия функций - в текстовом виде, все параметры- в текстовом виде.


Кстати насчет массивов данных, что тут лучше, base64? Нормально будет для объемов до 500Кб?
А то что то меня душит, непойму что :lol:
Iron Bug Дата 26.3.2013, 22:43
  Вот, по-быстрому написала, как в С++11 это сделать можно.
Это без Qt(я её не юзаю), но не суть. Можно любые классы и контейнеры использовать, это не принципиально.
У меня заюзан простой map и функция, принимающая int, для примера.
В GCC компилируется с опцией -std=c++11.
Раскрывающийся текст
#include <map>
#include <string>
#include <stdio.h>
#include <functional>

using namespace std;

class Base
{
public:
        typedef std::function<void(int d)> CommandProc;
        typedef map<string,CommandProc> map_type;

protected:
        map_type processors;
public:
        Base() {
                processors.insert(map_type::value_type("BaseCommand",std::bind(&Base::BaseCommand, this, std::placeholders::_1)));

        }
        void Command (string str, int value) {
                map_type::iterator iter = processors.find(str);
                if(iter != processors.end())
                        (iter->second)(value);
        };
protected:
        void BaseCommand(int value) {
                printf("this is Base::BaseCommand with argument %d\n",value);
        }
};

class Child1 : public Base
{
protected:
        void MyCommand(int value) {
                printf("this is Child1::MyCommand with argument %d\n",value);
        }
public:
        Child1() {
                processors.insert(map_type::value_type("MyCommand",std::bind(&Child1::MyCommand, this, std::placeholders::_1)));
        }
};

class Child2 : public Base
{
protected:
        void MyCommand(int value) {
                printf("this is Child2::MyCommand with argument %d\n",value);
        }
public:
        Child2() {
                processors.insert(map_type::value_type("MyCommand",std::bind(&Child2::MyCommand, this, std::placeholders::_1)));

        }
};


int main(int argc, char* argv[])
{
        Child1 test1;
        test1.Command("BaseCommand",10);
        test1.Command("MyCommand",10);
        Child2 test2;
        test2.Command("BaseCommand",20);
        test2.Command("MyCommand",20);
}
Алексей1153 Дата 26.3.2013, 18:04
  lanz, все названия функций - в текстовом виде, все параметры- в текстовом виде. Работать будет как часы (небольшая потеря производительности, причём вряд ли заметная - плата за универсальность)

по сути - экземпляру передаётся XML с названием функции и перечисленными атрибутами - параметрами (с их значениями)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 2.5.2024, 16:10