2010-10-13 16 views
1

Je viens de commencer à utiliser la bibliothèque SFML et son fantastique. Toutefois, lorsque vous redimensionnez une fenêtre en faisant glisser le coin avec ma souris, je n'obtiens pas les événements de redimensionnement jusqu'à ce que je relâche la souris. Cela signifie que je ne peux pas mettre à jour mes graphiques tant que la souris n'est pas relâchée (la boucle de jeu est sur le thread graphique) et provoque également un flot massif d'événements à travers toutes les positions de redimensionnement.Événements de redimensionnement de la fenêtre SFML bloquant le thread principal

Comment puis-je faire en sorte que le redimensionnement ne bloque pas le fil?

Répondre

2

Windows provoque cela. GetEvent() devient bloquant si vous déplacez ou redimensionnez la fenêtre. (Une autre petite raison amusante de détester cet OS ...)

J'ai résolu ce problème avec un thread d'interrogation d'événement séparé. Jetez un oeil à ceci: (La partie intéressante pour vous est tout à fait dans main.cpp.)

https://bitbucket.org/torokati44/netframework/src/93bdf20d0f65/main.cpp

+0

Pourquoi utilisez-vous 2 files d'attente d'événement (event_buffer_a, event_buffer_b)? Et pourquoi utilisez-vous std :: queue au lieu de std :: vector? – Truncheon

+0

Ceci est appelé double mise en mémoire tampon. Eh bien ... je ne suis pas sûr que ce soit vraiment nécessaire après tout, mais ça fonctionne maintenant, et j'ai des choses plus importantes à peaufiner dans ce projet, donc je ne plaisante pas avec ça maintenant. Oui, cela peut être fait avec un seul tampon. La raison pour laquelle j'ai fait deux peut être que je pensais que l'insertion bloquerait, mais seulement les blocs GetEvent, donc l'insertion après cela est OK. En outre, je ne pense pas qu'ils doivent être deque, la file d'attente serait suffisante. Et j'utilise la file d'attente car il est plus rapide d'afficher/de pousser que de vectoriser, parce que c'est une liste chaînée, et non un "tableau de style C" en arrière-plan. – torokati44