Para o que é programação de rede impulsionar-asio a melhor abordagem para processar a resposta?

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

Pergunta

Im novo para programação de rede e em particular a assíncronos-processos. Comece também novo, com o impulso-lib

Im implementação de uma classe, para aceder a uma imap-servidor. Posso enviar e receber o comandos e a resposta, em geral

A resposta está na fila em um dequeue dentro da classe. Pus simples as linhas de resposta na fila, para processamento adicional.

O que é agora a melhor maneira de processar a resposta na fila?

  1. Uma linha extra para verificar (tempo com base) a fila, para novas entradas?
  2. Cada vez que um novo entradas é empurrado para a fila de fazer algum retorno?
    Como posso implementar e integrar este retorno?

Talvez alguém tem um pequeno exemplo para isso.

Graças

Foi útil?

Solução

Cada vez que um novo entradas é empurrado para a fila de fazer algum retorno? Como posso implementar e integrar este retorno?

Eu suponho que você está trabalhando com conexão síncrona único segmento.

fazer algo assim:

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 !!!

Esta é a implementação único segmento. Se você quiser notificar a partir de outro segmento que deveria Não chamada some_worker->push_message(msg), você deve usar iosrvice:

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

E push_message seria chamado a partir da mesma linha que corre ioservice.

Outras dicas

Uma forma possível de implementar o processador de fila é a utilização de um semáforo de sinalização.

Por exemplo tipo de condição pthread ( descrição ) se você estiver em uma plataforma compatível com POSIX.

Você poderia ter N número de "threads de processamento de fila" de espera no fundo.

  1. Cada vez que algo é empurrado na fila de seu semáforo envia sinal que da.

    • O sinal é recebido por dormir tópicos "-processamento de fila", que inicia o processamento da fila, porque eles sabem que têm de dados.

    • Ao terminar o segmento de processamento de TI de dados, verifique fila de tamanho para ver se ele deve pegar outra coisa, se não, em seguida, voltar para à espera de um sinal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top