Actuellement, j'utilise un modèle de producteur pour la partie rendu d'une application graphique en temps réel. Le consommateur cherchera continuellement des données dans notre file d'attente (boucle infinie); Cependant, je crains que cela ne provoque une désynchronisation de la simulation de la boucle principale. Je pense que c'est le problème de la lenteur de la production chez les producteurs - aggravé par le fait que la simulation est limitée à un certain temps.Réutilisation du thread Boost (à partir du pool de threads) après une interruption ou une jointure
Question - quelle est la meilleure méthode pour garder tout cela en équilibre et assurez-vous que le consommateur a suffisamment de temps pour terminer, mais aussi que la simulation ne se déplace pas à l'image suivante avant que nous avons terminé le rendu notre courant cadre (ou au moins être en mesure de détecter et sauter rendu l'image suivante - ou d'interrompre la trame en cours étant rendu) Je suis actuellement un peu interromps et rejoindre après chaque consommateur est terminé
Deuxième question: si vous regardez Au code ci-dessous, vous verrez que je suis en train d'appeler l'interruption et de me joindre après avoir ajouté des tâches de rendu à la file d'attente - cela permet au thread tout le temps dont il a besoin pour terminer son fonctionnement, et pour répondre à l'interruption lorsque vous avez terminé. Comment puis-je réutiliser les threads dans un pool de threads après l'appel de interrupt_all et de join_all? (Si j'appelle drawNextFrame nouveau)
Le producteur fait partie du fil conducteur de l'exécution (je ne pense pas que cela affecte quoi que ce soit)
pseudo code:
void renderSystem::init()
create queue to hold work;
create consumer threads of type RenderConsumer set to watch our queue;
add threads to thread_pool of consumers called 'RenderThreads'
void renderSystem::drawNextFrame()
for each thread in 'RenderThreads' divy up work;
add work assignment to queue;
//RenderThreads will now successfully start pulling data from our queue
renderThreads.interupt_all();
renderThreads.join_all();
int main()
renderer = renderSystem class;
renderer.init()
while(not_gameover)
renderer.drawNextFrame();
doOtherCoolStuff();
profit(?)
return(0)
si vous avez besoin de regarder la classe des consommateurs voir ci-dessous:
pseudo code:
RenderConsumer::operator()()
while(true)
try to dequeue from queue
//digest any packet we get
for each (pixel in packet)
computePrettyStuff()
//we are now done with packet that we got
this_thread::interruption_point();
J'ai essayé de faire ce simple et rapide à digérer, je vous remercie pour votre temps