Bonjour,
Je ne sais pas exactement où poster, mais je pense que c'est l'endroit le plus approprié pour ce sujet, dans le cas contraire, veuillez m'en excuser.
Je code un petit jeux avec la SFML et je suis confronté à un petit problème :
J'ai une classe Hevent qui a une sous-classe Hwindows qui hérite de sf::RenderWindow.
Mais je veux diviser le processus en deux :
- l'un pour la gestion des évènements
- l'autre pour l'affichage
Je lance donc un thread sur une fonction :
Où afficher contient une boucle qui affiche la fenêtre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void lance_afficher(void *data) { Hevent *hevent = static_cast<Hevent*>(data); hevent->afficher(); }
Malheureusement, j'obtiens :
Même avec :X Error of failed request: BadAccess (attempt to access private resource denied)
Major opcode of failed request: 154 (GLX)
Minor opcode of failed request: 26 (X_GLXMakeContextCurrent)
Serial number of failed request: 84
Current serial number in output stream: 84
Alors que les fonctions accèdent normalement aux fonctions privée de Hevent....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Thread.Launch();//lancement de lance_afficher Thread.Wait();
Je tente donc de lancer le processus de gestion d'évènement dans le thread puis de laisser l'affichage dans le processus père.
Cette fois-ci j'ai :
Je décide donc d'entourer les fonctions :rr
rr
kikoo //à chaque tour de la boucle d'évent
rr
rr //rr à chaque tour de la boucle d'affichage (60/secondes max)
X Error of failed request: BadRequest (invalid request code or no such operation)
Major opcode of failed request: 0 ()
Serial number of failed request: 94
Current serial number in output stream: 100
Avec un verrou et miracle ça marche parfaitement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 utiliser_wind.Lock(); wind.GetEvent(Event); utiliser_wind.Unlock(); utiliser_wind.Lock(); wind.Display(); utiliser_wind.Unlock();
Mais alors quel est l'utilité de :
???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 SetFramerateLimit();
Puisqu'on si on arrive trop tôt sur Display() on va être bloqué pendant quelques ms.
On va donc attendre à l'intérieur d'une zone entourée de verrou...
C'est donc totalement inutile, il vaut mieux utiliser sf::Sleep.
Pourquoi ne puis-je pas utiliser Display() et GetEvent() en même temps?
Théoriquement il devrait déjà y avoir des verrou au sein même de la classe sf::RenderWindow afin de ne bloquer que lors de l'exécution des instructions des zones critiques, sinon on est obligé de bloquer la fonction entière...
Pourquoi m'est-il impossible de lancer un Display dans un processus fils??
Cordialement,
Neckara
EDIT : par contre si je remplace Display() par SetFramerateLimit(), je n'ai aucun problème (même sans verrou), donc il y a un problème lors de l'exécution de Display je pense.
Partager