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