IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

SFML : Sf::RenderWindow et Sf::Thread


Sujet :

Threads & Processus C++

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut SFML : Sf::RenderWindow et Sf::Thread
    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.

  2. #2
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Bonjour,

    tu auras plus de réponses (ou de meilleures), si tu demandes directement à Laurent sur son site

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    C'est ce que j'ai fait, mais je ne savais pas qu'il répondrait aussi vite.

    Bon, le problème persiste, mais je pense que je vais mettre ce sujet en "validé" puisque je pense avoir la solution à mon problème assez vite.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SFML] Problème avec affichage en thread
    Par black is beautiful dans le forum SFML
    Réponses: 0
    Dernier message: 05/05/2009, 10h33
  2. Tri multi-threadé
    Par Tifauv' dans le forum C
    Réponses: 8
    Dernier message: 28/06/2007, 09h00
  3. Programmer des threads
    Par haypo dans le forum C
    Réponses: 6
    Dernier message: 02/07/2002, 13h53
  4. Réponses: 5
    Dernier message: 12/06/2002, 15h12
  5. [Kylix] Pb de Thread !!
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 25/04/2002, 13h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo