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 :
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();
}
Où afficher contient une boucle qui affiche la fenêtre.

Malheureusement, j'obtiens :
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
Même avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
Thread.Launch();//lancement de lance_afficher
Thread.Wait();
Alors que les fonctions accèdent normalement aux fonctions privée de Hevent....

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 :
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
Je décide donc d'entourer les fonctions :
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();
Avec un verrou et miracle ça marche parfaitement.

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.