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

Auteur Sujet: Classes et thread ?  (Lu 2778 fois)

0 Membres et 1 Invité sur ce sujet

KonaKona

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Classes et thread ?
« le: Mai 10, 2016, 03:31:35 am »
Salut tout le monde ! :D

Je me suis mis tranquillement au C++ et la sfml et je fais un petit rpg rapido pour me faire la main, et là je bloque au niveau de la collision et des thread  :o

en gros je voudrais dédier un thread pour la collision pour tout le jeu, ce qui allégerais le programme en gros, sauf que lorsque je tape ce qu'il faut pour la collision il veut que je crée la classe avant ._. sachant qu'elle est créer dans le main

void detectionThread()
{
        if (joueur.getCollision().intersects(monstreDebug.getCollision()))
        {
                cout << "collision" << endl;
        }
}

Après moulte recherche je n'ai pas trouvé :'(
Donc j'ai tous foutus dans le main et ça marche mais je voudrais bien savoir sur quoi je butes siouplé :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Classes et thread ?
« Réponse #1 le: Mai 10, 2016, 06:22:21 am »
Citer
lorsque je tape ce qu'il faut pour la collision il veut que je crée la classe avant
Avec une description de ton problème aussi précise, on va bien pouvoir t'aider... ;D
Laurent Gomila - SFML developer

KonaKona

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Classes et thread ?
« Réponse #2 le: Mai 10, 2016, 12:05:21 pm »
Broaf désoler j'étais un peu dans les vapes en tapant ça ^^"

En gros dans le main thread je "déclare/crée" tranquillement mes classes et je lance mon thread juste après pour la détection des collisions.

Sauf que lorsque je tape du code dans le thread de collision il veut pas que j'accède au attribut de celui-ci il veut que je déclare dans le thread de la collision les classes pour les utiliser

j'arrives pas à mettre ça

void detectionThread()
{
        if (joueur.getCollision().intersects(monstreDebug.getCollision()))
        {
                cout << "collision" << endl;
        }
}

il voudrait en gros :

        joueur joueur(window.getSize().x, window.getSize().y);
        MonstreDebug monstreDebug(window.getSize().x, window.getSize().y);

        if (joueur.getCollision().intersects(monstreDebug.getCollision()))
        {
                cout << "collision" << endl;
        }

sauf que window est pas définie dans le second thread il voudrait que je redéclare etc..
j'arrive a accéder a aucune variable du thread principal alors que lorsque je regarde la doc (http://www.sfml-dev.org/tutorials/2.3/system-thread-fr.php ça évite de vous recherchez le lien :p) "Tous les threads d'un programme partagent la même mémoire, ils peuvent accéder à toutes les variables du programme. C'est très pratique mais aussi dangereux [...]"
je comprend plus :'(

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Classes et thread ?
« Réponse #3 le: Mai 10, 2016, 12:15:55 pm »
Ton thread est une fonction, et comme n'importe quelle fonction, elle n'a accès au'aux variables globales et aux variables locales à celle-ci. Le fait que tout ceci tourne dans un thread n'y change rien. En gros, si tu appelais detectionThread() directement, sans passer par un thread, tu aurais exactement la même erreur.

Ce que veut dire le tutoriel c'est que les threads partagent le même espace mémoire (au niveau de l'OS), pas que les règles de portée du C++ sont gentiment violées ;)

Si tu veux utiliser des variables déclarées ailleurs il faudra trouver un moyen de les passer à ta fonction threadée.
Laurent Gomila - SFML developer

KonaKona

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Classes et thread ?
« Réponse #4 le: Mai 10, 2016, 01:37:45 pm »
Ouai ! J'avais remarquer que cela marchait comme une fonction et j'avais essayer de passer ne paramètre la box de collision un peu comme l'exemple de la doc
void func(int x)
{
}

sf::Thread thread(&func, 5);

donc ce qui me donnait ça pour mes deux box de collisions

        sf::Thread thread(&detectionThread, sf::FloatRect collisionMonstre);
        //Lancement du thread de détection
        thread.launch(monstreDebug.getCollision());

sauf qu'il n'accepte pas ce paramètre alors que pour la création de classe il accepte bien pour une méthode un truc de ce style
        sf::FloatRect getCollision();

j'ai peur de ne pas être assez clair et je suis assez perdu dessus tu aurais des pistes (pas le code direct juste des piste) ? :D. (bien que ça ne me bloque pas vu que je fous les détections dans le main mais bon je voudrais bien test de mettre ça dans le thread)

et merci déjà pour tes réponses rapide Laurent :D

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Classes et thread ?
« Réponse #5 le: Mai 10, 2016, 02:09:49 pm »
Si j'étais toi j'oublierais cette histoire de thread. Ca te complique immensément la vie, pour pas grand chose comme gain. Si tu veux vraiment découpler collisions et affichage, il y a d'autres techniques plus adaptées  (Google devrait pouvoir t'aider).

Maintenant en ce qui concerne ce problème de passer des paramètres au point d'entrée du thread, compare bien l'exemple de la doc et ton code... ils n'ont rien à voir, en gros tu as écris n'importe quoi ;) En plus ça ne marchera pas, il faudrait passer les entités à la fonction, pas leur rectangle de collision, car celui-ci va (j'imagine) évoluer au cours du temps.
Laurent Gomila - SFML developer