我正在实现一个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,我明白我需要在一个单独的线程中运行无限循环。但我不知道如何正确实现。
再次感谢你。
答案 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库)。