2015-11-28 45 views
-1

我正在实现一个GUI应用程序,它使用基于zeroMQ(OpenBTS物理状态API)的通知系统。 我明白我必须把zeroMQ接收器放在一个单独的线程中,以不阻塞接口,但我不知道要实现什么类型的线程方法。 在此先感谢!C++多线程与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

请分享一些代码,否则我们无法帮到你,谢谢 –

+2

由于问题不确定,我认为这更多的是设计/体系结构问题,而不是一个特定的多线程问题。通信线程将在收到消息时与UI线程进行通信。你打算怎么做? UI框架通常不是线程安全的,所以你需要某种形式的上下文切换,例如,通过事件循环或Command模式。另一种选择是不同的设计,例如基于反应器的集成消息和UI。 – Jens

+1

对于问题风格感到遗憾,这里仍然是新的。我以前在c#中利用await-async构造做了类似的事情。更具体的是有什么类似的C + +? –

回答

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库)。

+0

非常感谢您的回答。我正在使用wxWidget作为GUI。据我了解,使用来自GUI框架的线程应该更安全,对吗? –

+0

@FC:我不明白为什么wxWidgets中的线程包装比std :: thread更安全,但它们可能也不会更糟。使用任何你喜欢的。最终我预计他们都是“线程”。 –