Frage

Ich versuche, die beste Lösung für nicht-blockierende IO über stdin / stdout mit den folgenden Eigenschaften zu finden:

  • Solange es genügend Daten vorhanden sind, lesen Sie in n -sized Stücke schneiden.
  • Wenn es nicht genügend Daten vor, in einem Teil chunk lesen.
  • Wenn es keine Daten verfügbar sind, Block, bis es einige (auch wenn es als kleiner sein kann n ).

Das Ziel ist eine effiziente Übertragung für große Datensätze zu ermöglichen, während ‚Kontrolle‘ Codes sofort die Verarbeitung (anstatt sie in einigen teilweise gefüllten Puffer verweilen irgendwo).

Ich weiß, ich kann dies erreichen, indem Fäden und ein istream :: get () Schleife oder durch eine Reihe von plattformspezifischen Code zu schreiben (da Sie können nicht wählen () auf Datei-Handles in Windows) ... ((es gibt auch istream :: readsome (), die vielversprechend scheint, aber die einzigen Ergebnisse, die ich auf google waren von Menschen finden kann sagen, es ist nicht wirklich gut funktionieren.))

Da ich nicht viel Codierung w / diese APIs getan haben, vielleicht gibt einen besseren Weg.

War es hilfreich?

Lösung

Vielleicht boost :: asio kann von für Sie verwenden?

Andere Tipps

Ich habe die Fäden und plattformspezifischen Code. Siehe meine Antwort auf eine andere Frage . Ich konnte das OS-spezifische Dinge in inputAvailable setzen () (Linux verwendet wählen Sie Windows nur zurückgibt true). Ich konnte dann mit WaitForSingleObject () mit einem Timeout auf Windows zu versuchen, den Faden komplett zu lassen, dann TerminateThread (), um es zu töten. Sehr hässlich, aber das Team wollte nicht dieses Stück Schub verwenden.

habe ich etwas ähnliches wie jwhitlock ... ich mit einer StdinDataIO Klasse endete, die um die entsprechende OS-spezifische Implementierung Wraps (*), so dass der Rest meines Programms wählen () auf dem Dateideskriptor StdinDataIO bietet, Rest völlig ahnungslos von Windows' Einschränkungen in Bezug auf stdin. Werfen Sie einen Blick hier und hier wenn man so will, ist der Code alle Open-Source / BSD-Lizenz.

(*) die Umsetzung ist eine einfache Pass-Through für Linux / Mac OS X und Windows ist es ein ziemlich komplexer Prozess der Schaffung eines untergeordneten Thread oben von stdin zu lesen und die Daten, die er empfängt über einen Socket zurück zum Haupt senden Thread ... nicht sehr elegant, aber es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top