如何通过boost :: interprocess :: message队列传递复杂对象(std :: string)

时间:2010-08-06 13:12:20

标签: c++ boost message-queue

有没有人有一些示例代码显示序列化std :: string的管道,通过boost :: interprocess :: message_queue发送它并再次将其恢复出去?

2 个答案:

答案 0 :(得分:8)

您需要序列化数据,因为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 :(得分:1)

解决方案可以是编写一个函数,该函数将要发送的对象作为输入(例如,您的可变大小字符串),并输出一个固定大小的对象的容器。

类似的东西:

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

然后可以从message_queue中发送/提取这些固定大小的对象。

与Maxim解决方案相比的优势在于您无需指定max_msg_size参数。