Ok, j'ai essayé toutes sortes de titres et ils ont tous échoué (donc si quelqu'un vient avec un meilleur titre, n'hésitez pas à le modifier: P)Problème de logique de sous-dépassement de la mémoire tampon, tutoriel de filetage?
J'ai le problème suivant: J'utilise une API pour accéder matériel, que je n'ai pas codé, pour ajouter des bibliothèques à cette API, j'ai besoin d'hériter de l'interface API, et l'API fait tout.
Je mets dans cette API, une bibliothèque de générateur de musique, le problème est que l'API mentionnée appelle seulement la bibliothèque de musique quand le tampon est vide, et demande une quantité de données codées en dur (exactement 1024 * 16 échantillons ... ne sais pas pourquoi). Cela signifie que la librairie de générateur de musique ne peut pas utiliser tout le potentiel du processeur pendant la lecture de musique, même si la librairie musicale ne fonctionne pas, l'utilisation de la CPU reste faible (3%), donc dans certaines parties de la musique qu'il y a des trucs trop complexes, les buffers underuns (c'est-à-dire: la carte son joue la zone dans le buffer qui est vide, parce que la fonction de bibliothèque musicale n'est pas encore revenue).
Peaufiner le nombre hardcoded, ne ferait que faire fonctionner le logiciel dans certaines machines, et ne pas travailler dans d'autres, en fonction de plusieurs facteurs ...
Alors je suis venu avec deux solutions: Hack l'API avec une nouvelle logique de tampon, mais je ne ai rien compris sur ce point.
Ou celui que j'ai réellement pensé la logique: Faire de la bibliothèque musicale avoir son propre thread, il aura son propre tampon séparé qu'il remplira tout le temps, lorsque l'API appelle la bibliothèque musicale pour plus de données, à la place de générer, il va simplement copier les données de ce tampon séparé dans le tampon de la carte son, puis reprend la génération de musique.
Mon problème est que même si j'ai plusieurs années d'expérience en programmation, j'ai toujours évité le multi-threading, je ne sais même pas par où commencer ...
La question est: Quelqu'un peut-il trouver une autre solution, Ou pointez-moi dans un endroit qui me donnera des informations sur la façon d'implémenter ma solution filetée?
EDIT:
Je ne suis pas en train de lire des fichiers, je suis GÉNÉRATION ou CALCULER, la musique, il a obtenu? Ce n'est pas une bibliothèque .wav ou .ogg. C'est pourquoi j'ai mentionné le temps CPU, si je pouvais utiliser 100% CPU, je n'aurais jamais une sous-performance, mais je ne peux utiliser CPU dans le court laps de temps entre le programme réalisant que le tampon atteint la fin, et la fin réelle de le tampon, et cette fois est parfois moins que le temps que le programme prend pour calculer la musique.
duplication possible de [Threading books for C++] (http://stackoverflow.com/questions/2334568/threading-books-for-c) –
lisez-vous (1024 * 16) octets à partir du disque chaque fois que l'API appelle votre fonction de rappel? – carlsborg
@Hans Pas de doublon, parce que je ne veux pas de livres, j'ai 2 jours pour l'implémenter: P Et il n'y a rien de complexe ... @tholomew Non, je génère 1024 * 16 octets, mais en streaming. wav files l'API lit 1024 * 16 octets depuis le disque, mais cette partie n'a rien à voir avec moi quand même ... – speeder