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.