使用ZeroMQ和CPPZMQ4.3.2,我希望删除所有套接字的旧消息,包括
因此,在绑定/连接之前,我在所有套接字上使用m_socks[channel].setsockopt(ZMQ_CONFLATE, 1)
。
测试
然而,当我进行下面的测试时,似乎旧的消息在每次重新连接时仍然会被刷新。在这次测试中,
下面是发送者的伪代码
// on sender end
auto thenSec = high_resolution_clock::now();
while(m_isRunning) {
// generate sinewave, double the frequency every 10s or so
auto nowSec = high_resolution_clock::now();
if (duration_cast<seconds>(nowSec - thenSec).count() > 10) {
m_sine.SetFreq(m_sine.GetFreq()*2);
thenSec = nowSec;
}
m_sine.Generate(audio);
// send to rendering thread
m_messenger.send("inproc://sound-ear.pair",
(const void*)(audio),
audio_size,
zmq::send_flags::dontwait
);
}
请注意,我已经使用DONTWAIT来减轻阻塞。
在接收端,我有一个zmq::poller_event
处理程序,它只接收事件轮询上的最后一条消息。
在停止序列中,我将正弦波频率重置到它的最低值,比如440 the。
期望的
预期的行为将是:
观察到的
但观察到的行为是,接收到的正弦波在重新启动通信后仍保持双倍频率,即880 of。
问题
我是不是做错了,还是应该用某种清除开关来强制删除所有的消息?
发布于 2020-06-10 07:25:21
好吧,我想我自己解决了。有点。
实际解
我终于意识到,我想要的行为是在停止呈现时刷新所有消息。根据官方医生(如何刷新ZeroMQ套接字队列中的所有消息),这只能通过以下方式实现:
ZMQ_LINGER
选项的套接字设置为0,这意味着在关闭这些套接字时不保留任何内容;这似乎是很多不必要的工作,如果我要再次重新呈现我的数据,就在停止序列之后。但我找不到其他方法干净利落地解决这个问题。
初始努力
在我看来,ZMQ_CONFLATE
对PAIR
并没有什么影响。我真的必须使用ZMQ_SNDHWM
和ZMQ_RCVHWM
来调整发送端和接收端的高水标记。
但是,我说“有点解决了”,因为调整HWM最终不是实时应用的最佳解决方案,
如果我没有做错什么,我想最理想的解决方案仍然是我的目标场景的共享内存。这是可悲的,因为我非常喜欢ZMQ的多播消息传递模式的简单性,并且讨厌处理随处可见的线程锁定。
https://stackoverflow.com/questions/62295562
复制相似问题