Как передать сложные объекты (std :: string) через boost :: interprocess :: очередь сообщений - PullRequest
3 голосов
/ 06 августа 2010

Есть ли у кого-нибудь пример кода, показывающего конвейер сериализации std :: string, отправляющий его через boost :: interprocess :: message_queue и возвращающий его снова?

Ответы [ 2 ]

8 голосов
/ 06 августа 2010

Вам необходимо сериализовать ваши данные, потому что boost :: interprocess :: message_queue работает с байтовыми массивами.Если все ваши сообщения являются строками, просто сделайте:

size_t const max_msg_size = 0x100;
boost::interprocess::message_queue q(..., max_msg_size);

// sending
std::string s(...);
q.send(s.data(), s.size(), 0);

// receiving
std::string s;
s.resize(max_msg_size);
size_t msg_size;
unsigned msg_prio;
q.receive(&s[0], s.size(), msg_size, msg_prio);
s.resize(msg_size);
1 голос
/ 03 октября 2011

Решением может быть написание функции, которая имеет в качестве входных данных объект, который вы хотите отправить (например, строку переменного размера), а в качестве выходного - контейнер объектов фиксированного размера.

Что-то вроде:

int Tokenize(std::vector<MessageToken>&, const Message&) const;
int Merge(Message&, const std::vector<MessageToken>&) const;                                    

Затем эти объекты фиксированного размера можно отправлять / извлекать из очереди сообщений.

Преимущество по сравнению с решением Максима заключается в том, чтонеобходимо указать параметр max_msg_size.

...