Domanda

Sto cercando di trovare la soluzione migliore per IO non bloccabile tramite stdin / stdout con le seguenti caratteristiche:

  • Finché ci sono abbastanza dati, leggi in blocchi di dimensioni n .
  • Se non ci sono abbastanza dati, leggi in una porzione parziale.
  • Se non ci sono dati disponibili, bloccare fino a quando non ce ne sono (anche se potrebbe essere inferiore a n ).

L'obiettivo è consentire un trasferimento efficiente per set di dati di grandi dimensioni durante l'elaborazione immediata dei codici di "controllo" (anziché farli rimanere in qualche buffer parzialmente riempito da qualche parte).

So di poterlo fare usando i thread e un ciclo istream :: get () o scrivendo un sacco di codice specifico per la piattaforma (poiché non è possibile selezionare () sugli handle di file in Windows) ... ((C'è anche istream :: readsome () che sembra promettente, ma gli unici risultati che posso trovare su Google sono stati di persone che dicevano che in realtà non funziona bene.))

Dato che non ho fatto molta codifica con queste API, forse c'è un modo migliore.

È stato utile?

Soluzione

Forse boost :: asio può essere utile per te?

Altri suggerimenti

Ho usato i thread e il codice specifico della piattaforma. Vedi la mia risposta a un'altra domanda . Sono stato in grado di mettere le cose specifiche del sistema operativo in inputAvailable () (Linux utilizza select, Windows restituisce semplicemente true). Potrei quindi utilizzare WaitForSingleObject () con un timeout su Windows per provare a completare il thread, quindi TerminateThread () per ucciderlo. Molto brutto, ma il team non ha voluto usare questo po 'di spinta.

Ho fatto qualcosa di simile a jwhitlock ... Ho finito con una classe StdinDataIO che avvolge l'implementazione specifica del sistema operativo appropriata (*) in modo che il resto del mio programma possa selezionare () sul descrittore di file che StdinDataIO fornisce, rimanendo beatamente ignaro delle limitazioni di Windows relative allo stdin. Dai un'occhiata a qui e qui se lo desideri, il codice è tutto open source / con licenza BSD.

(*) l'implementazione è un semplice pass-through per Linux / MacOSX e in Windows è un processo piuttosto complesso di impostazione di un thread figlio per leggere da stdin e inviare i dati che riceve su un socket al principale thread ... non molto elegante, ma funziona.

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