Pergunta

Estou tentando encontrar a melhor solução para não bloquear IO via stdin/stdout com as seguintes características:

  • Enquanto houver dados suficientes, leia em n-pedaços de tamanho.
  • Se não houver dados suficientes, leia em um pedaço parcial.
  • Se não houver dados disponíveis, bloqueie até que haja alguns (mesmo que possam ser menores do que n).

O objetivo é permitir uma transferência eficiente para grandes conjuntos de dados ao processar os códigos de 'controle' imediatamente (em vez de fazê-los permanecer em algum buffer parcialmente preenchido em algum lugar).

Eu sei que posso conseguir isso usando threads e um loop istream :: get () ou escrevendo um monte de código específico da plataforma (já que você não pode selecionar () em alças de arquivo no Windows) ... ((lá também é o iStream :: readsome (), o que parece promissor, mas os únicos resultados que posso encontrar no Google eram de pessoas dizendo que realmente não funciona bem.)))

Como não fiz muita codificação com essas APIs, talvez exista uma maneira melhor.

Foi útil?

Solução

Pode ser Boost :: Asio Pode ser útil para você?

Outras dicas

Eu usei os threads e o código específico da plataforma. Ver Minha resposta para outra pergunta. Consegui colocar as coisas específicas do OS em InputAvailable () (Linux usa selecionar, o Windows apenas retorna true). Eu poderia então usar o waitformingleObject () com um tempo limite no Windows para tentar deixar o thread completo e depois terminatethread () matá -lo. Muito feio, mas a equipe não queria usar esse pouco de impulso.

Eu fiz algo semelhante ao JWHITLOCK ... Acabei com uma classe Stdindataio que envolve a implementação apropriada específica do OS (*) para que o restante do meu programa possa selecionar () no descritor de arquivo stdindataio fornece, permanecendo ignorantemente ignorante de Limitações do Windows em relação ao stdin. Dar uma olhada aqui e aqui Se quiser, o código é todo de código aberto/licenciado por BSD.

(*) A implementação é um repasse simples para Linux/Macosx e, no Windows, é um processo bastante complexo de configurar um tópico infantil para ler em Stdin e enviar os dados que recebe sobre um soquete de volta ao segmento principal. . Não é muito elegante, mas funciona.

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