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).
"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
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
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