Forum de la communauté SFML

Aide => Fenêtrage => Discussion démarrée par: Aeon le Février 24, 2014, 10:31:28 pm

Titre: [Resolu]Resize et thread
Posté par: Aeon le Février 24, 2014, 10:31:28 pm
Bonjour à tous,

J'aimerais savoir comment vous faites pour traiter l'événement resize dans un contexte multi-threadé. En effet, j'ai besoin d'appeler glViewport et gluPerspective pour traiter mon événement resize et mon RenderWindow doit être actif. Sauf qu'il a été désactivé dans le thread principal pour qu'il soit actif dans le thread de dessin. Ma question est: est ce que vous synchronisez les 2 threads avec des mutex par exemple pour re activer le RenderWindow dans le thread principal ou avez vous une solution plus simple ?

Merci d'avance.
Titre: Re : Resize et thread
Posté par: Laurent le Février 24, 2014, 10:43:44 pm
En règle générale, il vaut mieux garder tout ce qui concerne le dessin dans le même thread. Plutôt que trimballer le contexte OpenGL entre plusieurs threads, trimballe plutôt des messages. Un message ça peut être un simple booléen qui indique qu'il s'est passé un truc, ou bien un système un peu plus élaboré de file de messages avec paramètres, protégée avec un mutex, sémaphore ou autre.

std::atomic_bool resized; // C++11

// thread d'évènements
while (window.isOpen())
{
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Resized)
            resized = true;

        ...
    }
}

// thread graphique
while (...)
{
    if (resized)
    {
        glViewport(...);
        gluPerspective(...);
        resized = false;
    }

    ... draw ...
}
Titre: Re : Resize et thread
Posté par: Aeon le Février 25, 2014, 08:14:04 am
Merci Laurent, réponse très claire. Je procède effectivement comme ça pour la gestion de la caméra mais je voulais savoir s'il y avait d'autres méthodes.