2017-10-02 1 views
1

Je crée un serveur en utilisant Boost asio et je suis confronté à un problème. Mon serveur doit pouvoir recevoir des données de plusieurs clients connectés et également envoyer des commandes à un client spécifique.Commande d'invitation à envoyer en file d'attente partagée dans boost asio

Pour ce faire, je suis instanciation d'une nouvelle session de connexion pour chaque client qui se connectent dans lequel j'appelle async_read avec un rappel qui font appel async_write avec un rappel qui font appel async_read etc ...

Le problème que je m face à est le suivant:

A avoir une interface graphique pour le serveur dans lequel je peux cliquer sur les commandes à envoyer, ces commandes sont ensuite mises dans une file d'attente partagée. Lorsque la file d'attente est partagée, chaque session de connexion peut interroger pour voir s'il y a une commande à envoyer à leur client connecté. Le problème est qu'avec ce schéma "callback s'appelant lui-même" dans la session, comment puis-je vérifier quand il y a une commande pour moi dans la file d'attente sans ruiner la performance (ma première solution était de mettre un timer l'opération async_write pour que je puisse vérifier chaque X secondes)?

Une idée?

Répondre

0

Le fait est que la gestion d'événements pro-acteur est fondamentalement opposée à l'interrogation d'une file d'attente.

Habituellement, vous allez créer une file d'attente et programmer une boucle d'écriture (en utilisant le style de rappel asynchrone) jusqu'à épuisement. Un exemple de cela est ici: http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/example/cpp03/chat/chat_client.cpp (recherchez chat_message_queue et write_in_progress).

Fondamentalement, vous injecter un événement (à savoir "message mis en file d'attente") et laissez la chaîne d'appel asynchrone vider la file d'attente. L'avantage sur faire la queue une action pour chaque message est que la chaîne d'appel asynchrone ne commande implicite/synchronization¹

brins implicites - ¹ Why do I need strand per connection when using boost::asio?