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

Auteur Sujet: [Résolu] [SFML 2.0] std::thread et sf::RenderWindow  (Lu 3814 fois)

0 Membres et 1 Invité sur ce sujet

trapster

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
[Résolu] [SFML 2.0] std::thread et sf::RenderWindow
« le: Mai 31, 2012, 04:46:24 pm »
Bonjour !

J'ai un programme qui créé un std::thread (norme C++11) qui exécute parallèlement une fonction modifiant ma sf::RenderWindow créée dans le thread principal depuis le thread secondaire... Sauf que lorsque je tente depuis le thread secondaire de, par exemple, dessiner une sf::RectangleShape, j'obtiens l'erreur suivante : Failed to activate the window's context

Voici un code minimal pour illustrer l'erreur :

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

class GraphicThread
{
        public:
                GraphicThread(sf::RenderWindow& window) : myWindowRef(window)
                {
       
                }

                void launch()
                {
                        sf::Clock clock;

                        sf::RectangleShape shape(sf::Vector2f(50, 50));
                        shape.setFillColor(sf::Color::Black);
                        shape.setOrigin(25, 25);

                        while(clock.getElapsedTime().asSeconds() < 10) {
                                shape.setRotation(clock.getElapsedTime().asSeconds() * 30.f);

                                myWindowRef.clear();
                                myWindowRef.draw(shape);
                                myWindowRef.display();
                        }
                }

                ~GraphicThread() {}

        private:
                sf::RenderWindow&        myWindowRef;
};

int main(int argc, char **argv)
{
        // Create window
        sf::RenderWindow window(sf::VideoMode(800, 600), "Threads");
        window.setVerticalSyncEnabled(true);

        // Create graphic thread
        GraphicThread gt(window);

        // Launch thread
        std::thread t(&GraphicThread::launch, &gt);

        // Thread join
        t.join();

        // Close window
        window.close();

        return 0;
}
 

Merci d'avance !
« Modifié: Mai 31, 2012, 05:00:12 pm par trapster »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0] std::thread et sf::RenderWindow
« Réponse #1 le: Mai 31, 2012, 04:51:41 pm »
Il faut appeler window.setActive(false) avant de lancer le thread.

Il te faut aussi une boucle d'évènements dans le thread principal, sinon ta fenêtre ne sera pas réactive.
Laurent Gomila - SFML developer

trapster

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : [SFML 2.0] std::thread et sf::RenderWindow
« Réponse #2 le: Mai 31, 2012, 04:59:54 pm »
Merci beaucoup ! Ça résout effectivement le problème !
Sinon un window.setActive(true) après le t.join() ne suffit pas pour réactiver la fenêtre depuis le thread principal ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [Résolu] [SFML 2.0] std::thread et sf::RenderWindow
« Réponse #3 le: Mai 31, 2012, 05:03:18 pm »
Citer
Sinon un window.setActive(true) après le t.join() ne suffit pas pour réactiver la fenêtre depuis le thread principal ?
Oui, mais pourquoi faire ?
Laurent Gomila - SFML developer

trapster

  • Newbie
  • *
  • Messages: 21
    • Voir le profil
Re : [Résolu] [SFML 2.0] std::thread et sf::RenderWindow
« Réponse #4 le: Mai 31, 2012, 05:19:26 pm »
Ben en fait la classe GraphicThread est sensée faire office de thread d'affichage d'un splashScreen le temps que mon thread principal fasse les initialisations nécessaire au programme (comme le chargement d'un niveau), du coup je n'aurai jamais deux threads qui agissent en même temps sur la même sf::RenderWindow

Bon en tout cas merci pour tes réponses plus que rapides ! Ça c'est du professionalisme  8)