2015-11-28 48 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更安全,但它們可能也不會更糟。使用任何你喜歡的。最終我預計他們都是「線程」。 –