2016-08-21 3 views
2

In C++ verwende ich ZeroMQ, um eine einfache Client-Server-Chat-Anwendung zu erstellen. Nachdem der Kontext im Hauptverzeichnis initialisiert wurde, möchte ich ihn an einen Thread übergeben und dort den Socket deklarieren, der für die Ausgabe der Nachrichten des Benutzers verwendet wird (d. H., Um die send durchzuführen). Dies ist mein aktueller Code (Client/Benutzerseite):Pass ZMQ-Kontext zu Thread

void Send(zmq::context_t& c) // To get messages from user and send them to the server 
{ 
    zmq::socket_t socket(c, ZMQ_REQ); 
    socket.connect ("tcp://192.168.1.84:5555"); 

    std::string mssg; 

    while (true) { 

     std::getline(std::cin, mssg); 

     if(mssg == "#exit") 
     { 
      killApp = true; // an atomic<bool> used to terminate all threads 
      break; 
     } 
     zmq::message_t mssg_(mssg.length()); 
     std::memcpy(mssg_.data(), mssg.data(), mssg.length()); 

     socket.send(mssg_); 

    } 

} 

int main() 
{ 
    // Initialising the context 
    std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1); 
    std::thread t_send(Send, *context.get()); // THIS DOESN'T WORK 

    { 
     // do some stuff in the main thread (e.g. display the messages) 
    } 

    t_send.join(); 
    return 0; 
} 

Ich versuche, den Zusammenhang unter Bezugnahme auf den Thread zu übergeben, so kann ich eine Buchse schaffen und den Rest der Operation durchführen. Aber ich weiß nicht, wie ich es richtig machen soll. (Alternativ ist es auch in Ordnung, ein zmq :: socket_t zu übergeben, aber ich habe das gleiche Problem, wenn ich versuche, das zu tun).

+1

"Ich habe das gleiche Problem" - Ihre Frage wäre erheblich besser, wenn Sie tatsächlich angegeben, was das "gleiche Problem" ist, und welche Probleme Sie damit haben. – WhozCraig

+0

Ich empfehle zmq nicht als Starter-Framework. Es umhüllt die Socket-API so sehr, dass Sie nicht verstehen, was passiert. Außerdem verliert es immer noch die erste Nachricht in TCP comm. Verwenden Sie stattdessen Boost Asio. Sie lernen Konzepte kennen, die für Netzwerk-IO grundlegend sind. – rustyx

+0

In Zmq können Sie Kontexte aber * nie * Sockets zwischen zwei Threads teilen. Und warum nicht (in Ihrem ursprünglichen Code): 'zmq :: context_t context (1); Std :: Thread t_send (Senden, Kontext); '? – cibercitizen1

Antwort

0

Hier ist, wie ich es gelöst habe: Vorbei an den Kontext als LeereZeiger und es dann zurück zum ZMQ Gießen :: context_t:

void Send(void* context) // To get messages from user and send them to the server 
{ 
    zmq::socket_t s(*(zmq::context_t*)context,ZMQ_REQ); 
    s.connect ("tcp://192.168.1.84:5555"); 
    ... 
    ... 
} 

int main() 
{ 
    std::shared_ptr<zmq::context_t> context = std::make_shared<zmq::context_t>(1); 
    std::thread t_send(Send, static_cast<void*>(context.get())); 
    ... 
    return 0; 
} 

Hoffen, dass es jemanden in denen hilft Zukunft.

0

Sie können einige Beispiele in zmqHelper finden. Es gibt ein Beispiel für einen Chat, viele Threads, die über inproc-Sockets kommunizieren (den Kontext freigeben) und einen Server mit Workern (die auch über inproc verbunden sind).