Question

J'essaie de trouver la meilleure solution pour les entrées-sorties non bloquantes via stdin / stdout présentant les caractéristiques suivantes:

  • Tant qu'il y a suffisamment de données, lisez-les dans des morceaux de la taille n .
  • S'il n'y a pas assez de données, lisez-les dans un bloc partiel.
  • Si aucune donnée n'est disponible, bloquez-la jusqu'à ce qu'il y en ait (même si elle est inférieure à n ).

L'objectif est de permettre un transfert efficace de grands ensembles de données tout en traitant immédiatement les codes de contrôle (au lieu de les laisser quelque part dans un tampon partiellement rempli).

Je sais que je peux y parvenir en utilisant des threads et une boucle istream :: get (), ou en écrivant un tas de code spécifique à la plate-forme (car vous ne pouvez pas sélectionner () sur les descripteurs de fichier dans Windows) ... ((Il y a aussi istream :: readsome () qui semble prometteur, mais les seuls résultats que je peux trouver sur Google sont ceux qui disent que ça ne marche pas vraiment.))

Étant donné que je n'ai pas beaucoup codé avec ces API, il existe peut-être un meilleur moyen.

Était-ce utile?

La solution

Peut-être que boost :: asio peut être d'utilisation pour vous?

Autres conseils

J'ai utilisé les threads et le code spécifique à la plate-forme. Voir ma réponse à une autre question . J'ai été en mesure de mettre les éléments spécifiques au système d'exploitation dans inputAvailable () (Linux utilise select, Windows ne fait que renvoyer true). Je pourrais ensuite utiliser WaitForSingleObject () avec un délai d’expiration sous Windows pour essayer de laisser le fil se terminer, puis TerminateThread () pour le tuer. Très moche, mais l’équipe ne voulait pas utiliser ce coup de pouce.

J’ai fait quelque chose de similaire à jwhitlock ... Je me suis retrouvé avec une classe StdinDataIO qui encapsule l’implémentation spécifique au système d’exploitation appropriée (*), de sorte que le reste de mon programme puisse sélectionner () le descripteur de fichier fourni par StdinDataIO. béatement ignorant des limitations de Windows concernant stdin. Consultez ici et ici si vous voulez, le code est entièrement open-source / sous licence BSD.

(*) L'implémentation est une simple transmission pour Linux / MacOSX. Sous Windows, il s'agit d'un processus assez complexe de configuration d'un thread enfant à lire à partir de stdin et à renvoyer au serveur principal les données qu'il reçoit via un socket. fil ... pas très élégant, mais ça marche.

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