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

Auteur Sujet: [Résolu] [SFML 2] sf::Thread - Arrêt temporaire du thread principal  (Lu 2391 fois)

0 Membres et 1 Invité sur ce sujet

Nikogram

  • Newbie
  • *
  • Messages: 39
    • Voir le profil
    • E-mail
Bonjour à tous.
Dans mon jeu, quand par exemple le personnage est proche de la fin du terrain, je dois charger le terrain devant lui et supprimer le terrain qu'il y a derrière. L'opération en question doit enregistrer dans plusieurs fichiers environ 800000 entiers et accéder à plus de 6 millions de variables, ce qui fait que lors de ce chargement le rafraichissement de l'affichage s'arrête pendant une ou deux secondes.

Pour éviter cet arrêt assez gênant j'ai donc commencé à mettre en place un thread secondaire permettant de faire ce chargement en fond.
Mais il y a un problème : le moment d'arrêt est toujours présent quand le jeu doit charger le nouveau morceau de terrain. Pourtant je crée bien un sf::Thread avant le while (fenetre.isOpen()) dans le main.
Autre information : le thread secondaire exécute la méthode d'un objet (créé lui aussi au début du main).

Je voudrais donc savoir si il est normal que le thread principal est affecté quand le thread secondaire effectue de lourdes opérations ?
Merci d'avance.

PS : voilà comment j'utilise les sf::Thread :
int main()
{
        // initialisations

        Monde monde(fenetre, vue, std::round(nombreBlocsCotes + 10));
        sf::Thread thread(&Monde::genererNouvellesRegions, &monde);

        // initialisations

        while (fenetre.isOpen())
        {
                // gestion des évenements
               
                thread.launch();

                // affichage et autres opérations
        }

        return EXIT_SUCCESS;
}
« Modifié: Mai 11, 2013, 08:14:46 pm par Nikogram »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2] sf::Thread - Arrêt temporaire du thread principal
« Réponse #1 le: Mai 11, 2013, 07:11:06 pm »
Tu relances ton thread à chaque tour de boucle. Lance le une seule fois, avant.
Laurent Gomila - SFML developer

Nikogram

  • Newbie
  • *
  • Messages: 39
    • Voir le profil
    • E-mail
Re : [SFML 2] sf::Thread - Arrêt temporaire du thread principal
« Réponse #2 le: Mai 11, 2013, 08:05:57 pm »
Ah oui effectivement. Merci ^^
J'ai donc sortit le launch de la boucle, et j'ai mis une boucle while dans la méthode pour l'exécuter en continu. A la fin de chaque tour de boucle je mets un sf::sleep(sf::seconds(1)); pour soulager le processeur.

La méthode est bien exécuté, le sleep fonctionne, mais le jeu est complètement bloqué, comme si le thread principal était en pause. Et ce problème ne survient pas quand les opérations lourdes sont effectuées.
D'où pourrait donc venir le problème ?

EDIT : j'ai juste mis un sf::sleep(sf::seconds(1)); dans la méthode genererNouvellesRegions, et là l'affichage se met à jour toutes les secondes (donc ça fait un peut comme si le jeu ramait), alors que l'affichage s'effectue normalement dans le premier thread. C'est comme si le sleep s'effectuait dans le thread principal.
Je précise que je n'appelle pas genererNouvellesRegions autrement que par le sf::Thread.

EDIT 2 : Désolé pour le EDIT du dessus c'est bon j'ai corrigé le problème (pas placé le launch au bon endroit enfaite  :P). Autrement plus de problème ;)
« Modifié: Mai 11, 2013, 08:14:32 pm par Nikogram »