我注意到,当我使用* 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);
}
答案 0 :(得分:1)
Ops,我在代码中发现了一个错误。 message_queue按预期工作,问题在于令牌容器的管理方式。