
Envoyé par
Franck SORIANO
Personnellement, cette approche me pose deux problèmes :
- Arrêter le thread secondaire pour que le principal mette à jour l'affichage, je trouve que c'est un comble lorsqu'on fait du multi-threading. L'intérêt du multi-threading c'est que tout le monde bosse en même temps. Idéalement même, que l'affichage se fasse lorsque le thread secondaire est bloqué en attente d'E/S. Ici si le thread principale était occupé au moment du synchronize, le thread secondaire peut resté bloqué un moment...
- Il y a un problème dans le sens des dépendances. Logiquement, le thread secondaire implémente le métier, le thread principale l'IHM. Or l'IHM doit être construite par dessus le métier. Le métier ne doit savoir que l'IHM existe. Ici, c'est le métier qui pilote la mise à jour de l'affichage en appelant le code de mise à jour de l'affichage dans le synchronize...
Moi je fais plutôt l'inverse : Je laisse les informations d'états nécessaire à l'affichage dans le thread secondaire.
Ce dernier se contente de poster une notification à celui qui la demande (avec un vulgaire PostMessage sur un Handle de fenêtre fournit à la création du thread secondaire).
Lorsque le thread principale décide de mettre à jour l'affichage (en réponse à la notification, sur un timer...), il va lire les informations d'états nécessaires auprés du thread secondaire. Bien évidemment, ces dernières sont protégées par une section critique.
De cette façon, le thread secondaire n'est pas rallenti le temps que le thread principale fasse sont boulo. Et lorsque le thread principal met à jour l'affichage, il peut disposer des informations les plus à jour...
A la base, le double buffer n'est pas utilisé pour ça mais pour éviter les effets de clignotement et synchroniser l'affichage des buffers avec le ballayage de l'écran :
La carte graphique (ce n'est pas un thread) affiche le premier buffer à la vitesse du ballayage.
Pendant ce temps, tu dessines le nouvel écran dans un buffer arrière pour éviter par exemple que le ballayage ne passe et affiche le buffer entre le moment ou tu as dessiné le fond et le moment ou tu n'as pas encore dessiné tes sprites...
Et si tu veux même que la bascule entre le buffer avant et le buffer arrière se fasse exactement au moment où le ballayage a terminé l'écran (la synchro Verticale), il te faut même un troisième buffer : Deux buffers prêt à être affichés au moment où la carte graphique le nécessitera, et un troisième sur lequel tu peux préparer tranquillement l'affichage.
Partager