带有zeroMQ的C ++多线程

时间:2015-11-28 10:47:30

标签: c++ multithreading zeromq

我正在实现一个GUI应用程序,该应用程序使用基于zeroMQ(OpenBTS物理状态API)的通知系统。 我知道我必须将zeroMQ接收器放在一个单独的线程中以阻止接口,但我不知道要实现什么类型的线程方法。 提前谢谢!

编辑:接收器的zeroMQ代码是

zmq::context_t context(4);
zmq::socket_t targetPublisher(context, ZMQ_SUB);
std::string localopenbts = "tcp://127.0.0.1:45160";

targetPublisher.setsockopt(ZMQ_SUBSCRIBE, "", 0);
targetPublisher.connect(localopenbts.c_str());
while (1) {
    try {
        zmq::message_t event;
        targetPublisher.recv(&event);
        std::cout << std::string(static_cast<char*>(event.data()), event.size()) << std::endl;

    } catch(const zmq::error_t& e) {
        std::cout << "!! exception !!" << std::endl;
    }
}

为了不阻止GUI,我明白我需要在一个单独的线程中运行无限循环。但我不知道如何正确实现。

再次感谢你。

1 个答案:

答案 0 :(得分:1)

在C ++ 11中,类似这样:

void receiveFunction(const std::string& uri)
{
    // the code from your question goes here, using OpenMQ
}

int main()
{
    std::thread receiveThread(receiveFunction, "tcp://127.0.0.1:45160");

    // do GUI stuff here
}

这将在早期启动一个新线程(receiveThread),可以完全用于运行您发布的ZeroMQ代码。然后你可以在原始帖子中自由地做任何其他事情。

如果您需要将数据从接收线程传递到GUI线程,您可能需要查看GUI库提供的功能(但您没有告诉我们您正在使用哪个GUI库)。