代码之家  ›  专栏  ›  技术社区  ›  bradgonesurfing

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

  •  3
  • bradgonesurfing  · 技术社区  · 15 年前

    有没有人有一些示例代码来显示序列化std::string的管道,通过boost::interprocess::message\队列将其发送并再次取出?

    2 回复  |  直到 15 年前
        1
  •  8
  •   Maxim Egorushkin    15 年前

    您需要序列化数据,因为boost::interprocess::message\u 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);
    
        2
  •  1
  •   Pietro    14 年前

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

    比如:

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

    与Maxim的解决方案相比,它的优点是不需要指定 max_msg_size