Boost message_queue:当我收到一个对象时,如何将其从队列中删除?

时间:2011-10-07 11:25:27

标签: boost message-queue

我注意到,当我使用* receive()成员函数从Boost message_queue获取对象时,该对象仍然在队列中。因此,如果我多次读取相同的message_queue,即使没有从另一方插入任何内容,我也会不断获取相同对象的副本。

有没有办法在读取对象后从队列中删除它?

E.g:

boost::scoped_ptr<boost::interprocess::message_queue> pMQueue;

message_queue::remove("myQueue");

pMQueue.reset(new message_queue(open_or_create, "myQueue", 100, sizeof(MyClass)));

MyClass token;
std::vector<MyClass> tokens;
size_t recvdSize = 0;
float timeDelay = 100;  // milliseconds
bool dataAvailable = true;

// If I do this block twice, I receive the same tokens twice

while(dataAvailable)
{
    ptime t = microsec_clock::universal_time() + milliseconds(timeDelay);

    dataAvailable = pMQueue->timed_receive(&token, sizeof(token), recvdSize, 0, t);

    if(dataAvailable && recvdSize > 0)
        tokens.push_back(token);
    else if(recvdSize == 0)
        break;
    else if(recvdSize != sizeof(token))
        exit(1);
}

1 个答案:

答案 0 :(得分:1)

Ops,我在代码中发现了一个错误。 message_queue按预期工作,问题在于令牌容器的管理方式。