Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [Abandon] Multi-thread pour gérer deux fenêtres  (Lu 3053 fois)

0 Membres et 1 Invité sur ce sujet

zedex

  • Newbie
  • *
  • Messages: 27
    • Voir le profil
[Abandon] Multi-thread pour gérer deux fenêtres
« 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 :
  • une gérée par Qt (contenant un menu pour sauvegarder, etc ... Je ne m'y attarde pas plus que ça)
  • une fenêtre contenant le tileset sur laquelle on peut sélectionner la tuile gérée par SFML
  • une fenêtre sur laquelle on vient poser les tuiles et constituer graphiquement la carte, aussi gérée par SFML
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 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.
« Modifié: Octobre 13, 2013, 09:05:36 pm par zedex »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Multi-thread pour gérer deux fenêtres
« Réponse #1 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.
Laurent Gomila - SFML developer

zedex

  • Newbie
  • *
  • Messages: 27
    • Voir le profil
Multi-thread pour gérer deux fenêtres
« Réponse #2 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();
    }
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Multi-thread pour gérer deux fenêtres
« Réponse #3 le: Octobre 13, 2013, 07:27:19 pm »
Il te faut un appel à XInitThreads() au tout début de ton application (inclut Xlib.h).
Laurent Gomila - SFML developer

zedex

  • Newbie
  • *
  • Messages: 27
    • Voir le profil
Re : Multi-thread pour gérer deux fenêtres
« Réponse #4 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" :
  • Très souvent il "ne fait rien", je suis obligé de l'arrêter brutalement.
  • Parfois il se lance (avec les deux fenêtres tout de même ;)) mais plante très vite avec un message d'erreur.
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

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Multi-thread pour gérer deux fenêtres
« Réponse #5 le: Octobre 13, 2013, 08:53:34 pm »
Désolé c'était ma seule idée :-\
Laurent Gomila - SFML developer

zedex

  • Newbie
  • *
  • Messages: 27
    • Voir le profil
Multi-thread pour gérer deux fenêtres
« Réponse #6 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.