Per la programmazione della rete spinta ASIO che cosa è l'approccio migliore per l'elaborazione della risposta?

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

Domanda

Im nuovo a rete di programmazione e, in particolare, per asincrone-processi. Inizia anche nuovo con la spinta-lib

Im attuazione di una classe, per accedere a un imap-server. Posso inviare e ricevere la comandi e la risposta, in generale

La risposta è in coda in un dequeue all'interno della classe. Ho messo semplici righe di risposta nella coda, per l'ulteriore elaborazione.

Qual è oggi il modo migliore per elaborare la risposta in coda?

  1. Un filo in più per controllare (tempo in base) la coda, per le nuove voci?
  2. Ogni volta che un nuovo voci è spinto alla coda di fare qualche richiamo?
    Come posso implementare e integrare questo callback?

Forse qualcuno ha un breve esempio di questo.

Grazie

È stato utile?

Soluzione

  

Ogni volta che un nuovo voci è spinto alla coda di fare qualche richiamo?   Come posso implementare e integrare questo callback?

Presumo si sta lavorando con collegamento sincrono singolo thread.

fare qualcosa di simile:

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(); }
    }

};

Nota !!!

Questa è l'attuazione singolo filo. Se si desidera comunicare da altro thread si dovrebbe Non chiamare some_worker->push_message(msg), si dovrebbe usare iosrvice:

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

E push_message sarebbe chiamato dallo stesso filo che corre ioservice.

Altri suggerimenti

Un modo per attuare la coda processore è quello di utilizzare un semaforo di segnalazione.

Ad esempio la pthread tipo di condizione ( descrizione ) se siete su una piattaforma compatibile con POSIX.

Si potrebbe avere un numero N di "fili coda di elaborazione" in attesa in background.

  1. Ogni volta che qualcosa viene spinto nella coda del semaforo tuo invia è il segnale.

    • Il segnale viene ricevuto dormendo fili "coda di elaborazione", che iniziano l'elaborazione della coda, perché sanno di avere dei dati.

    • Quando il filo termina l'elaborazione IT di dati, controllare la dimensione della coda per vedere se deve afferrare qualcosa d'altro, se non poi tornare in attesa di un segnale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top