Win Qt IPC (signals-slots)

PooH

как лучше всего реализовать обмен "сообщениями" между двумя процессами в WIN (в UNIX это легко и просто реализуется через dbus)
сейчас реализовал через queue в QSharedMemory:
отправка сообщения:
lock
в одном процессе читаю содержимое sharedmemory в QByteArray, ставлю разделитель "\n", дописываю новое сообщение, сериализованное в char[], записываю QByteArray в sharedmemory
unlock
в другом процессе:
lock
читаю содержимое sharedmemory в QByteArray, беру первое (отрезаю по "\n" QByteArray без первого сообщения записываю в sharedmemory
unlock
обрабатываю сообщение
на мой взгляд получается очень громоздко и неудобно - каждый раз приходится вытаскивать все содержимое sharedmemory и парсить массивы чаров
можно ли каким-то другим способом это реализовать
идеально было бы просто класть в sharedmemory QQueue<MyMsgClass> и из разных процессов эту очередь менять, но чувствую, что моих знаний не хватает для того, чтобы самому написать собственную очередь с нестандартным аллокатором (интересно, вообще возможно поменять аллокатор для QT контейнеров)

PooH

как можно простыми способами инициализировать массив структур без членов указателей
типа
struct MSG { int id; char msg[256]; int sender; int receiver;}
в определенном месте (sharedmemory)

Dasar

читаю содержимое sharedmemory в QByteArray, беру первое (отрезаю по "\n" QByteArray без первого сообщения записываю в sharedmemory
зачем так сложно? в том смысле, зачем читать всё (а потом остаток запихивать обратно) вместо того, чтобы вычитать только первое сообщение?

Dasar

как можно простыми способами инициализировать массив структур без членов указателей
memset или MSG* arr = (MSG*)sharedmemory_ptr;
в зависимости от того, что именно подразумевается под инициализацией массива

PooH

вот такая структура:
 
struct MSG { int id; char msg[256]; int sender; int receiver; MSG(char* msg = "");}

реализацию опустил
как мне организовать массив таких структур в определенном месте (в той самой sharedmemory)?

dazzler

как лучше всего реализовать обмен "сообщениями" между двумя процессами в WIN (в UNIX это легко и просто реализуется через dbus)
dbus же, вроде бы, портирован под Windows: http://www.freedesktop.org/wiki/Software/dbus#Windows_port

dazzler

можно ли каким-то другим способом это реализовать
Есть ещё QLocalSocket, по сути являющийся named pipe'ом.

PooH

короче, простыми словами сейчас объясню:
хочу контейнер (MyQueue) для простой структуры (см. выше) в виде очереди (FIFO который лежит в нужном месте компактно
чтобы можно было в одном процессе сделать:
 
 
QSharedMemory share('ID');
...
share.lock;
MyQueue* queue = new_in_shared_memory MyQueue;
queue->put(MSG("blah-blah";
share.unlock;

а в другом:
 
 
share.lock;
MyQueue* queue = (MyQueue*) share.data;
MSG msg = queue->take;
share.unlock;

PooH

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

PooH

Есть ещё QLocalSocket, по сути являющийся named pipe'ом.
прикольная вещь, если с sharedmemory не взлетит, то попробую его

Dimon89

прикольная вещь, если с sharedmemory не взлетит, то попробую его
А чем shared memory так зацепила? Мы во всех проектах QLocalSocket используем, и отлично получается. Цель-то какая?

PooH

Цель-то какая?
есть главное приложение с GUI, запускается с привилегиями пользователя
есть пара процессов (консольных или скрытых которые запускаются с повышенными привилегиями (это обновлятор - должен писать в program files и резидентная программа-сервис, которая проверяет некоторые вещи)
для общения между всеми этими процессами нужен удобный интерфейс - в главной программе выводится текущий прогресс и контролируется поведение процессов
яркий пример: пользователь запускает главную программу, она запускает процесс, который проверяет файлы по контрольной сумме, пока идет проверка в окне главной программы отображает текущий прогресс проверки с возможностью отменить, приостановить и сделать еще что-нибудь
по результатам проверки скачивается обновление, а его установкой занимается другой процесс, опять-таки нужно демонстрировать прогресс и иметь над ним контроль
почему разбито по процессам - нужно разделение по правам (запускать главную программу с правами администратора не хочется)

PooH

кстати, первая версия всей этой системы была сделана на способности QProcess перенаправлять и читать stdout и stderr запущенного процесса
но т.к. QProcess не умеет делать elevate, то от него пришлось отказаться

Dimon89

есть главное приложение с GUI, запускается с привилегиями пользователя
есть пара процессов (консольных или скрытых которые запускаются с повышенными привилегиями (это обновлятор - должен писать в program files и резидентная программа-сервис, которая проверяет некоторые вещи)
Мы точно такую же функциональность делаем на QLocalSocket. Очень удобно. Служебного кода буквально пара строк.

Maurog

как лучше всего реализовать обмен "сообщениями" между двумя процессами в WIN
ссылка по теме: http://www.rsdn.ru/forum/cpp.applied/5032554.1

PooH

ссылка по теме: http://www.rsdn.ru/forum/cpp.applied/5032554.1
да я уже читаю про boost.interprocess
но уже, видимо, не судьба
проект, над которым я работаю, не сильно нужен компании и все работы по нему будут приостановлены
оффтоп, где бы поискать работу (удаленную qt, c++)?
мне не хочется возвращаться к php и всему этому web-сброду

elenangel

может, placement new поможет?

Maurog

может, placement new поможет?
поможет void*, зуб даю :grin:

apl13

оффтоп, где бы поискать работу (удаленную qt, c++)?
На qt-форуме есть раздел Jobs, как ни странно.
Оставить комментарий
Имя или ник:
Комментарий: