Как да предавате сложни обекти ( std::string ) през boost::interprocess::message queue

Някой има ли примерен код, показващ тръбопровода за сериализиране на std::string, изпращайки го през boost::interprocess::message_queue и връщайки го отново?


person bradgonesurfing    schedule 06.08.2010    source източник


Отговори (2)


Трябва да сериализирате вашите данни, защото 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);
person Maxim Egorushkin    schedule 06.08.2010

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

Нещо като:

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

Тогава тези обекти с фиксиран размер могат да бъдат изпратени в/извлечени от message_queue.

Предимството в сравнение с решението на Maxim е, че не е необходимо да указвате параметър max_msg_size.

person Pietro    schedule 03.10.2011