Forum de la communauté SFML

Aide => Système => Discussion démarrée par: zedex le Octobre 13, 2013, 03:56:11 pm

Titre: [Abandon] Multi-thread pour gérer deux fenêtres
Posté par: zedex le Octobre 13, 2013, 03:56:11 pm
Bonjour.
Je suis en train de réaliser un petit éditeur de cartes pour un jeu façon rpg. Il serait constitué de 3 fenêtres :
Actuellement j'ai des problèmes avec les deux dernières fenêtres, j'aimerais qu'elles soient gérées dans deux threads séparés de la manière suivante :

int main(int argc, char args[])
{
    sf::Thread threadWindowTileSet(&windowTileSet);
    sf::Thread threadWindowMap(&windowMap);

    threadWindowTileSet.launch();
    threadWindowMap.launch();

        return 0;
}
 

En lançant un thread uniquement cela fonctionne, mais pas avec deux en même temps.

De plus il est dit dans le tutoriel (http://www.sfml-dev.org/tutorials/2.1/system-thread-fr.php) que l'on peut protéger les données partagées. Je souhaiterais que les deux theads travaillent sur un objet passé en argument du genre :

void windowTileSet(Map carte);

Est-ce possible et dois-je donc utiliser les mutex ?

Merci.
Titre: Re : Multi-thread pour gérer deux fenêtres
Posté par: Laurent le Octobre 13, 2013, 05:12:36 pm
Citer
En lançant un thread uniquement cela fonctionne, mais pas avec deux en même temps.
Merci de préciser un peu la partie "ça marche pas" ;)

Citer
Est-ce possible et dois-je donc utiliser les mutex ?
Oui.
Titre: Multi-thread pour gérer deux fenêtres
Posté par: zedex le Octobre 13, 2013, 06:57:56 pm
Merci de préciser un peu la partie "ça marche pas" ;)

Là est tout le problème hahaha. Des fois il ne se passe rien (le programme tourne, mais les deux fenêtres ne s'affichent pas et il n'y a pas de messages d'erreurs dans la console), des fois cela s'arrête avec un message du genre :

Démarrage de Cpp_Qt_SFML_MapEditor...XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0"
      after 83 requests (79 known processed) with 6 events remaining.
XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0.0"
      after 83 requests (79 known processed) with 6 events remaining.
Cpp_Qt_SFML_MapEditor a quitté avec le code 1

ou bien

Démarrage de Cpp_Qt_SFML_MapEditor...Le programme s'est terminé subitement.
Cpp_Qt_SFML_MapEditor a quitté avec le code 0

Je ne pense pas que cela vienne des fonctions, c'est "afficher bêtement une fenêtre vide" mais je met quand même le code au cas où :

void windowMap()
{
    sf::RenderWindow windowMap(sf::VideoMode(600,450),"Map");

    while (windowMap.isOpen())
    {
        sf::Event event;

        while (windowMap.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                windowMap.close();
        }

        windowMap.clear(sf::Color::White);
        windowMap.display();
    }
}
Titre: Re : Multi-thread pour gérer deux fenêtres
Posté par: Laurent le Octobre 13, 2013, 07:27:19 pm
Il te faut un appel à XInitThreads() au tout début de ton application (inclut Xlib.h).
Titre: Re : Multi-thread pour gérer deux fenêtres
Posté par: zedex le Octobre 13, 2013, 08:39:02 pm
J'ai rajouté le header et XInitThreads() à mon programme, mais maintenant il se comporte de façon "aléatoire" :
Message d'erreur que voici :

Démarrage de Cpp_Qt_SFML_MapEditor...
Failed to create input context for window -- TextEntered event won't be able to return unicode
Cpp_Qt_SFML_MapEditor: ../../src/xcb_io.c:385: _XAllocID: Assertion `ret != inval_id' failed.
Le programme s'est terminé subitement.
Cpp_Qt_SFML_MapEditor a quitté avec le code 0
Titre: Re : Multi-thread pour gérer deux fenêtres
Posté par: Laurent le Octobre 13, 2013, 08:53:34 pm
Désolé c'était ma seule idée :-\
Titre: Multi-thread pour gérer deux fenêtres
Posté par: zedex le Octobre 13, 2013, 09:05:11 pm
Bon ben tant pis, je voulais essayer d'utiliser les threads pour avoir un code "plus propre" mais bon. Je vais donc gérer toutes les fenêtres dans le main principal.  :)

Merci beaucoup.