Pregunta

Estoy tratando de encontrar la mejor solución para no bloquear IO a través de stdin / stdout con las siguientes características:

  • Mientras haya suficientes datos, lea en fragmentos n .
  • Si no hay suficientes datos, lea en un fragmento parcial.
  • Si no hay datos disponibles, bloquee hasta que haya algunos (aunque puede ser menor que n ).

El objetivo es permitir una transferencia eficiente de grandes conjuntos de datos mientras se procesan los códigos de 'control' inmediatamente (en lugar de que permanezcan en algún búfer parcialmente lleno en alguna parte).

Sé que puedo lograr esto usando hilos y un bucle istream :: get (), o escribiendo un montón de código específico de la plataforma (ya que no puede seleccionar () en los controladores de archivos en Windows) ... ((También hay istream :: readsome () que parece prometedor, pero los únicos resultados que puedo encontrar en Google fueron de personas que dicen que en realidad no funciona bien.))

Dado que no he codificado mucho con estas API, quizás haya una mejor manera.

¿Fue útil?

Solución

Quizás boost :: asio puede ser de uso para usted?

Otros consejos

Usé los hilos y el código específico de la plataforma. Consulte mi respuesta a otra pregunta . Pude poner las cosas específicas del sistema operativo en inputAvailable () (Linux usa select, Windows simplemente devuelve true). Entonces podría usar WaitForSingleObject () con un tiempo de espera en Windows para intentar dejar que el hilo se complete, luego TerminateThread () para matarlo. Muy feo, pero el equipo no quería usar este impulso.

Hice algo similar a jwhitlock ... Terminé con una clase StdinDataIO que se ajusta a la implementación específica del sistema operativo (*) para que el resto de mi programa pueda seleccionar () en el descriptor de archivo que proporciona StdinDataIO, quedando felizmente ignorante de las limitaciones de Windows con respecto a stdin. Eche un vistazo aquí y aquí si lo desea, el código es de código abierto / con licencia BSD.

(*) la implementación es un paso simple para Linux / MacOSX, y en Windows es un proceso bastante complejo de configurar un subproceso secundario para leer desde stdin y enviar los datos que recibe a través de un zócalo de nuevo al principal hilo ... no muy elegante, pero funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top