Pour la programmation réseau boost-asio Quelle est la meilleure approche pour le traitement de la réponse?

StackOverflow https://stackoverflow.com/questions/763429

Question

Im nouveau au réseau de programmation et en particulier aux processus asynchrones. Commencez également nouvelle avec le boost-lib

Im la mise en œuvre d'une classe, d'accéder à un serveur imap-. Je peux envoyer et recevoir les commandes et les réponses, de manière générale

La réaction est mise en attente dans un dequeue intérieur de la classe. Je mets simples les lignes de réponse dans la file d'attente, pour un traitement ultérieur.

Quelle est maintenant la meilleure façon de traiter la réponse mis en attente?

  1. Un fil supplémentaire pour vérifier (temps en fonction) la file d'attente, pour les nouvelles entrées?
  2. Chaque fois qu'une nouvelle entrée est poussé à la file d'attente faire une rappel?
    Comment puis-je mettre en œuvre et intégrer ce rappel?

Peut-être que quelqu'un a un court exemple pour cela.

Merci

Était-ce utile?

La solution

  

Chaque fois qu'une nouvelle entrée est poussé à la file d'attente faire un peu de rappel?   Comment puis-je mettre en œuvre et intégrer ce rappel?

Je suppose que vous travaillez avec une connexion synchrone unique de fil.

Faites quelque chose comme ça:

class worker {

    deque<message> messages;
    bool is_writing_;

    push_message(message msg) {
        messages.push_back(msg);
        notify();
    }

    void notify()
    {
        if(!is_writing_) {
            is_writing_=true;
            init();
        }
    } 

    void init()
    {
        if(messages.empty()) { is_writing_=false; return; }
        messamge msg=messages.pop();
        convert_to_vector(v);
        async_write(socket,buffer(v),
            boost::bind(&worker::complete,this,placehoders::error));
    }
    void complete(error_code const &e)
    {
        if(!e) {
            init();
        }
        else { cleanup(); }
    }

};

Remarque !!!

est unique mise en œuvre du fil. Si vous souhaitez que Notify d'autre thread que vous devriez pas appeler some_worker->push_message(msg), vous devez utiliser iosrvice:

service.post(boost::bind(&worker::push_message,some_worker,msg));

Et push_message serait appelé à partir du même fil qui fonctionne ioservice.

Autres conseils

Une façon possible de mettre en oeuvre le processeur de files d'attente est d'utiliser un sémaphore de signalisation.

Par exemple pthread type de condition ( Description ) si vous êtes sur une plate-forme conforme aux spécifications POSIX.

Vous pourriez avoir N nombre de « threads de traitement de file d'attente » d'attente en arrière-plan.

  1. Chaque fois que quelque chose est bousculé dans la file d'attente de votre sémaphores envoie est le signal.

    • Le signal est reçu par le sommeil « file d'attente de traitement » fils qui commencent le traitement de la file d'attente parce qu'ils savent qu'ils ont données.

    • Quand le fil se termine le traitement des données de, vérifiez la taille de la file d'attente pour voir si elle doit saisir quelque chose d'autre, sinon, puis revenir à l'attente d'un signal.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top