Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 13/01/2013, à 20:23

Destroyers

[C++] Gérer l'ouverture d'une fenêtre dans thread secondaire [RESOLU]

Bonjour à tous.
Ma question est dans le titre:
comment gérer l'ouverture d'une fenêtre dans un thread secondaire ?

J'ai certainement trouvé quelques réponses potentielles sur:
http://www.google.fr/url?sa=t&rct=j&q=g … 0187,d.d2k

Cependant, je n'arrive pas a aller sur ce site ...

Je m'adresse donc à vous smile

J'ai programmé un jeu, une fenêtre s'ouvre, et quand je clique sur un bouton "option", une deuxième fenêtre s'ouvre dans un thread pour afficher les options.
Ça compile, aucune erreur, aucun  avertissements, les oiseaux chantent...

Je lance l’exécutable dans une console, le jeu fonctionne, jusqu'à ce que je clique sur le bouton options:

denis@denis:~/programmation/C++/alpha/hero$ ./hero
[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
hero: ../../src/xcb_io.c:178: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.
Abandon (core dumped)

Et le programme est avorté.

Merci des solutions que vous m'apporterez smile

Dernière modification par Destroyers (Le 15/01/2013, à 18:18)

Hors ligne

#2 Le 13/01/2013, à 20:25

Haleth

Re : [C++] Gérer l'ouverture d'une fenêtre dans thread secondaire [RESOLU]

J'suis pas expert dans la techno que tu n'as pas nommé, mais j'imagine que tu doit utilisé la fonction XInitThreads.
Regarde la doc de ladite techno.


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#3 Le 13/01/2013, à 20:27

Destroyers

Re : [C++] Gérer l'ouverture d'une fenêtre dans thread secondaire [RESOLU]

Je compile avec g++, j'utilise boost-thread et la SFML. il n'existe pas de fonction XInitThreads (ou alors je n'en ai pas connaissance, je ne l'utilise pas)
J'ai déjà regardé les docs, pas de solutions :S

Hors ligne

#4 Le 13/01/2013, à 20:35

Haleth

Re : [C++] Gérer l'ouverture d'une fenêtre dans thread secondaire [RESOLU]

Essaye ca par exemple

Tu peux aussi essaye d'utiliser XInitThreads en incluant les headers xlib


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#5 Le 13/01/2013, à 20:59

Destroyers

Re : [C++] Gérer l'ouverture d'une fenêtre dans thread secondaire [RESOLU]

j'ai trouvé quelques autres infos complémentaires :
http://tronche.com/gui/x/xlib/display/XInitThreads.html

J'ai beau mettre la fonction XInitThreads(); au tout début du main, ça ne règle pas le problème, j'ai la même erreur.

Dernière modification par Destroyers (Le 13/01/2013, à 20:59)

Hors ligne

#6 Le 14/01/2013, à 05:19

grim7reaper

Re : [C++] Gérer l'ouverture d'une fenêtre dans thread secondaire [RESOLU]

Salut, tu devrait lire la doc de SFML.
Genre :

http://www.sfml-dev.org/tutorials/2.0/window-window.php a écrit :

You can create multiple windows
SFML allows you to create multiple windows, and to handle them either all in the main thread, or each one in its own thread (but... see below). In this case, don't forget to have an event loop for each window.
[…]
Events must be polled in the window's thread
This is an important limitation of most OSes: the event loop (more precisely, the pollEvent or waitEvent function) must be called in the same thread that created the window. This means that if you want to create a dedicated thread for event handling, you'll have to make sure that the window is created in this thread too. If you really want to split things between threads, it is more convient to keep event handling in the main thread and move the rest (rendering, physics, logic, ...) to a separate thread instead. This configuration will also be compatible with the other limitation described below.
[…]
On OS X, windows and events must be managed in the main thread
Yep, that's true. Mac OS X just won't agree if you try to create a window or handle events in a thread other than the main one.

Donc voilà, ça semble faisable (et encore, là je sors la doc de la SFML 2, si tu es encore sur la 1.6 je ne sais pas…) mais même si tu y arrives ça sera pas portable.
Maintenant, c’est toi qui vois.

Hors ligne

#7 Le 14/01/2013, à 19:15

Destroyers

Re : [C++] Gérer l'ouverture d'une fenêtre dans thread secondaire [RESOLU]

Je ne comprend pas...
Je crée déjà la fenêtre dans le même thread que la gestion des événements ...

Toutes les conditions énoncées dans la doc sont respectées dans mon programme.

Hors ligne

#8 Le 14/01/2013, à 19:28

Destroyers

Re : [C++] Gérer l'ouverture d'une fenêtre dans thread secondaire [RESOLU]

#include<boost/thread/thread.hpp>
#include<SFML/Graphics.hpp>



void opt(bool *eteindre,)
{
	while(*eteindre==false)
	{	
		
			sf::RenderWindow option_wind(sf::VideoMode(250,350),"Hero-Options");
			sf::Event evenement;
			while(option_wind.IsOpened())
			{
                                option_wind.Clear();
				while(option_wind.GetEvent(evenement))
				{
					if(evenement.Type==sf::Event::Closed)
					{
						option_wind.Close();
					}
				}
                        option_wind.Display();
			}
	}
}



int main()
{
sf::RenderWindow wind(sf::VideoMode(950,660),"Hero");
sf::Event evenement;
bool eteindre=false;

boost::thread t_option(opt,&eteindre,);

		while(wind.IsOpened)
		{
                        option_wind.Clear();
			while(wind.GetEvent(evenement))
			{
				if(evenement.Type==sf::Event::Closed)
				{
					wind.Close();
					eteindre=true;
				}	
			}
                        option_wind.Display();
		}
eteindre=true;
t_option.join();
return 0;
}

Hors ligne

#9 Le 15/01/2013, à 06:54

grim7reaper

Re : [C++] Gérer l'ouverture d'une fenêtre dans thread secondaire [RESOLU]

Salut,

grim7reaper a écrit :

Donc voilà, ça semble faisable (et encore, là je sors la doc de la SFML 2, si tu es encore sur la 1.6 je ne sais pas…) mais même si tu y arrives ça sera pas portable.
Maintenant, c’est toi qui vois.

Après tests, je confirme : ça fonctionne avec SFML 2 (si tu ajoute bien un appel à XInitThreads), mais pas avec la 1.6.


Mais bon, de manière générale je ne pense pas que tu partes sur une bonne piste (même si ça passe sous Linux, il y a peu de chance que àa tourne sous Windows et Mac apparemment).
Les bibliothèques genre SFML et SDL sont pas spécialement conçu pour gérer plusieurs fenêtres (elles peuvent, mais c’est pas simple comme tu peux le voir), donc le mieux serait de tout faire dans la fenêtre principale je pense.
Regarde les jeux vidéos, ils n’utilisent qu’une seule fenêtre.

Si tu à vraiment besoin d’ouvrir plusieurs sous-fenêtre, alors il vaudrait peut-être mieux partir sur du GTK, Qt, WxWidget, …

Dernière modification par grim7reaper (Le 15/01/2013, à 07:11)

Hors ligne

#10 Le 15/01/2013, à 18:17

Destroyers

Re : [C++] Gérer l'ouverture d'une fenêtre dans thread secondaire [RESOLU]

C'est dommage :S
Je vais suivre ton conseil.
Merci. wink

Hors ligne