Manière standard d'implémenter un flux mis en mémoire tampon qui se vide à intervalle constant ?

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

Question

Je simule des paquets provenant d'une source qui produit des paquets à un intervalle paquet/seconde donné.Je veux créer une classe de flux qui fonctionne comme un ostream objet, permettant operator<< à utiliser pour afficher des éléments via celui-ci, mais avec la mise en garde que chaque valeur insérée doit être libérée du tampon vers un descripteur de fichier, dans l'ordre, à un intervalle spécifié.

Ainsi, par exemple, je pourrais avoir un socket avec un descripteur de fichier sockfd et dis:

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

et la sortie serait chronométrée de telle sorte qu'elle produirait

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

à la prise.Je regarde Boost.Iostreams en ce moment, serait-ce une bonne solution ?Existe-t-il une expression magique que je peux rechercher sur Google pour décrire ce problème et dont je ne suis pas au courant ?

Toute aide serait appréciée.

Merci Brad

Était-ce utile?

La solution

Une option pour ce faire, complètement orthogonale à la création d'une classe de flux personnalisée, serait de maintenir une file d'attente de chaînes interrogées par un thread toutes les secondes.Chaque fois que la file d'attente est interrogée, le thread lit le premier élément et l'envoie sur le réseau.

Cela n'utilise pas la bibliothèque streams, mais je pense que c'est peut-être ce que vous voulez.En interne, la plupart des flux regroupent simplement toutes les entrées qu'ils reçoivent dans une masse de texte, perdant ainsi les informations sur les parties du texte qui correspondent à chaque objet que vous avez inséré.

MODIFIER:J'aurais dû le mentionner la première fois, mais assurez-vous d'utiliser la synchronisation appropriée sur cette file d'attente !Vous souhaiterez probablement utiliser un mutex pour en protéger l'accès, ou utiliser une file d'attente intelligente sans verrouillage si cela ne fonctionne pas.Assurez-vous simplement de ne pas lire et écrire aveuglément à partir de plusieurs threads.

Autres conseils

Les 1000 ms doivent-ils être asynchrones ?Sinon, vous pouvez mettre un Sleep(1000) dans l'opérateur<< de votre flux.Selon ce que vous essayez de faire, cela pourrait vous convenir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top