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

Auteur Sujet: Reactiver renderwinow dans le thread principal  (Lu 2835 fois)

0 Membres et 1 Invité sur ce sujet

Millsialix

  • Invité
Reactiver renderwinow dans le thread principal
« le: Juin 24, 2016, 06:42:02 pm »
Bonjour,
J'ai récemment commencé un programme avec beaucoup de choses a charger, et j'ai eu envie de rajouter une image qui tourne pour signaler ce chargement, seulement, pour que ce soit fluide, la seule solution que j'ai trouvée est d'afficher cette image dans un autre thread. Il y a donc un thread qui affiche une image qui tourne et le thread principal qui charge mes données. Problème, quand je tente d'afficher quelque chose avec le thread principal quand le chargement est fini (après avoir désactivé le thread et fait fenetre.setActive(true)), ca reste bloqué sur le sprite de chargement qui ne tourne plus...
Donc voila, je voudrais qu'on m'explique ou est mon erreur, ou bien une autre façon de faire ce sprite de chargement qui tourne.
Merci d'avance

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

struct parametreLoad {
    sf::RenderWindow* fenetre;
    bool me;
};

void affichageChargement( parametreLoad* par ){
    sf::Texture text;
        text.loadFromFile( "a.png" );
    sf::Sprite fond( text );

    while( par->me == true ){
        // C'est juste un code simplifié, le sprite ne tourne pas ici
        par->fenetre->clear();
        par->fenetre->draw( fond );
        par->fenetre->display();
    }
    par->fenetre->setActive( false );
    // Je desactive la fenetre dans le thread
}

int main(){
    sf::RenderWindow fenetreTT( sf::VideoMode( 800, 450 ), "" );
        fenetreTT.setActive( false );

    bool me = true;

    parametreLoad param;
    param.fenetre = &fenetreTT;
    param.me = me;

    sf::Thread threadLoad( &affichageChargement, &param );
    threadLoad.launch();

    sf::Clock ma; while( ma.getElapsedTime().asSeconds() < 2 ){}
    // Pour tester, le thread va m'afficher le sprite pendant 2 secondes

    param.me = false;
    // Normalement, le thread arrete d'afficher le sprite et desactive la fenetre

    threadLoad.wait();
    fenetreTT.setActive( true );
    // Et je réactive la fenetre

    fenetreTT.clear( sf::Color::Red );
    ma.restart(); while( ma.getElapsedTime().asSeconds() < 2 ){}
    // Et pour tester, je remplis ma fenetre de rouge pendant 2 secondes
}
 

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Reactiver renderwinow dans le thread principal
« Réponse #1 le: Juin 24, 2016, 10:24:21 pm »
Avec un fenetreTT.display() après avoir rempli en rouge, chez moi ça fonctionne comme prévu.
Laurent Gomila - SFML developer

Millsialix

  • Invité
Re : Reactiver renderwinow dans le thread principal
« Réponse #2 le: Juin 24, 2016, 10:36:58 pm »
A oui oups, petite erreur d’inattention ^^'
Bah merci alors