Standardmethode zum Implementieren eines gepufferten Streams, der in einem konstanten Intervall geleert wird?

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

Frage

Ich simuliere Pakete von einer Quelle, die Pakete in einem bestimmten Paket- / Sekunden-Intervall erzeugt.Ich möchte eine Stream-Klasse erstellen, die wie eine funktioniert ostream objekt, erlauben operator<< wird verwendet, um Dinge darüber auszugeben, jedoch mit der Einschränkung, dass jeder eingefügte Wert der Reihe nach in einem bestimmten Intervall aus dem Puffer in einen Dateideskriptor freigegeben werden sollte.

So könnte ich zum Beispiel einen Socket mit Dateideskriptor haben sockfd und sag:

MyBuffer buffer(sockfd, 1000); //Interval of 1000 milliseconds
buffer << 1 << 2 << 3;

und die Ausgabe würde so zeitlich festgelegt, dass sie ausgeben würde

1
<1 second gap>
2
<1 second gap>
3

an die Steckdose.Ich schaue auf Boost.Iostreams im Moment, wäre das eine gute Lösung?Gibt es einen magischen Satz, den ich googeln kann, der dieses Problem beschreibt, das mir nicht bekannt ist?

Jede Hilfe wäre dankbar.

Danke Brad

War es hilfreich?

Lösung

Eine Möglichkeit, dies zu tun, die vollständig orthogonal zum Erstellen einer benutzerdefinierten Streams-Klasse ist, besteht darin, eine Warteschlange mit Zeichenfolgen zu verwalten, die jede Sekunde von einem Thread abgefragt wird.Jedes Mal, wenn die Warteschlange abgefragt wird, liest der Thread das erste Element aus und sendet es über das Netzwerk.

Dies verwendet nicht die Streams-Bibliothek, aber ich denke, das könnte das sein, was Sie wollen.Intern fassen die meisten Streams einfach alle Eingaben, die sie erhalten, zu einer Textmasse zusammen, wodurch die Informationen darüber verloren gehen, welche Teile des Textes jedem von Ihnen eingefügten Objekt entsprechen.

BEARBEITEN:Ich hätte das beim ersten Mal erwähnen sollen, aber bitte stellen Sie sicher, dass Sie die entsprechende Synchronisation in dieser Warteschlange verwenden!Wahrscheinlich möchten Sie einen Mutex verwenden, um den Zugriff darauf zu schützen, oder eine clevere Warteschlange ohne Sperre verwenden, wenn dies nicht funktioniert.Stellen Sie nur sicher, dass Sie nicht blind aus mehreren Threads lesen und darauf schreiben.

Andere Tipps

Sollten die 1000ms asynchron sein?Wenn nicht, könnten Sie einen Sleep (1000) in den Operator Ihres Streams einfügen<<.Je nachdem, was du versuchst zu tun, könnte es dir passen.

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