Per la programmazione della rete spinta ASIO che cosa è l'approccio migliore per l'elaborazione della risposta?
-
11-09-2019 - |
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?
- Un filo in più per controllare (tempo in base) la coda, per le nuove voci?
- 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
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.
-
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.
-