gpt4 book ai didi

c++ - 类内的 ZMQ C++ 事件循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:17 27 4
gpt4 key购买 nike

我使用 ZMQ 的总体目标是避免陷入异步消息传递的困境; ZMQ 似乎是一种便携实用的解决方案。然而,大多数 ZeroMQ 文档 like this ,以及我在 Google 上搜索过的许多其他 zmq 示例都基于 helloworld.c 格式。也就是说,它们都是 int main(){} 中的简单程序代码。

我的问题是我想在类 C++ 单例类中“嵌入”一个 zmq“监听器”。我想“听”消息然后处理它们。我打算使用 zmq 的 PUSH -> PULL 套接字,以防万一。我不知道该怎么做是在内部“事件循环”中。

class foomgr {
public:
static foomgr& get_foomgr();
// ...
private:
foomgr();
foomgr(const &foomgr);
// ...
listener_() {
// EVENT LOOP HERE
// RECV and PROCESS ZMQ MSGS
// while(true) DOES NOT WORK HERE
}
// ...
zmq::context_t zmqcntx_;
zmq::socket_t zmqsock_;
const int zmqsock_linger_ = 1000;
// ....
}

我显然不能在监听器中使用 while(true) 结构,因为无论我从哪里调用它都会阻塞。由于使用 ZMQ 的优点之一是我不必自己管理“监听器”线程,因此必须弄清楚如何创建自己的线程来包装 listener_ 似乎很愚蠢。我迷失了解决方案。

注意:我是一个 C++ 新手,所以对大多数人来说显而易见的东西对我来说却并非如此。另外,我试图使用通用的“单词”,而不是特定于库或语言的,以避免混淆。该代码是使用 -std=c++11 构建的,因此那些构造很好。

最佳答案

ZMQ C++ 库没有实现消息轮询的监听器模式。它将任务留给您来包装在您自己的类中。但是,它确实支持轮询新消息的非阻塞模式。

因此,使用正确的代码,您可以以非阻塞方式将其包装在一个小循环中。

查看此 Polling Example here on GitHub用 C++ 编写。请注意,它从 2 个套接字进行轮询,因此您需要稍微修改它以删除额外的代码。

您需要包装在自己的观察者实现中的重要部分如下:

zmq::message_t message;
zmq::poll (&items [0], 2, -1);

if (items [0].revents & ZMQ_POLLIN) {
receiver.recv(&message);
// Process task
}

关于c++ - 类内的 ZMQ C++ 事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19988483/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com