Win Qt IPC (signals-slots)
типа
struct MSG { int id; char msg[256]; int sender; int receiver;}
в определенном месте (sharedmemory)
читаю содержимое sharedmemory в QByteArray, беру первое (отрезаю по "\n" QByteArray без первого сообщения записываю в sharedmemoryзачем так сложно? в том смысле, зачем читать всё (а потом остаток запихивать обратно) вместо того, чтобы вычитать только первое сообщение?
как можно простыми способами инициализировать массив структур без членов указателейmemset или MSG* arr = (MSG*)sharedmemory_ptr;
в зависимости от того, что именно подразумевается под инициализацией массива
struct MSG { int id; char msg[256]; int sender; int receiver; MSG(char* msg = "");}
реализацию опустил
как мне организовать массив таких структур в определенном месте (в той самой sharedmemory)?
как лучше всего реализовать обмен "сообщениями" между двумя процессами в WIN (в UNIX это легко и просто реализуется через dbus)dbus же, вроде бы, портирован под Windows: http://www.freedesktop.org/wiki/Software/dbus#Windows_port
можно ли каким-то другим способом это реализоватьЕсть ещё QLocalSocket, по сути являющийся named pipe'ом.
хочу контейнер (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;
dbus же, вроде бы, портирован под Windows:хм, это конечно хорошо
но тащить за собой целую технологию ради пары десятков сообщений не хочется
Есть ещё QLocalSocket, по сути являющийся named pipe'ом.прикольная вещь, если с sharedmemory не взлетит, то попробую его
прикольная вещь, если с sharedmemory не взлетит, то попробую егоА чем shared memory так зацепила? Мы во всех проектах QLocalSocket используем, и отлично получается. Цель-то какая?
Цель-то какая?есть главное приложение с GUI, запускается с привилегиями пользователя
есть пара процессов (консольных или скрытых которые запускаются с повышенными привилегиями (это обновлятор - должен писать в program files и резидентная программа-сервис, которая проверяет некоторые вещи)
для общения между всеми этими процессами нужен удобный интерфейс - в главной программе выводится текущий прогресс и контролируется поведение процессов
яркий пример: пользователь запускает главную программу, она запускает процесс, который проверяет файлы по контрольной сумме, пока идет проверка в окне главной программы отображает текущий прогресс проверки с возможностью отменить, приостановить и сделать еще что-нибудь
по результатам проверки скачивается обновление, а его установкой занимается другой процесс, опять-таки нужно демонстрировать прогресс и иметь над ним контроль
почему разбито по процессам - нужно разделение по правам (запускать главную программу с правами администратора не хочется)
но т.к. QProcess не умеет делать elevate, то от него пришлось отказаться
есть главное приложение с GUI, запускается с привилегиями пользователяМы точно такую же функциональность делаем на QLocalSocket. Очень удобно. Служебного кода буквально пара строк.
есть пара процессов (консольных или скрытых которые запускаются с повышенными привилегиями (это обновлятор - должен писать в program files и резидентная программа-сервис, которая проверяет некоторые вещи)
как лучше всего реализовать обмен "сообщениями" между двумя процессами в WINссылка по теме: http://www.rsdn.ru/forum/cpp.applied/5032554.1
ссылка по теме: http://www.rsdn.ru/forum/cpp.applied/5032554.1да я уже читаю про boost.interprocess
но уже, видимо, не судьба
проект, над которым я работаю, не сильно нужен компании и все работы по нему будут приостановлены
оффтоп, где бы поискать работу (удаленную qt, c++)?
мне не хочется возвращаться к php и всему этому web-сброду
placement new поможет?
может, может, placement new поможет?поможет void*, зуб даю
оффтоп, где бы поискать работу (удаленную qt, c++)?На qt-форуме есть раздел Jobs, как ни странно.
Оставить комментарий
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 контейнеров)