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

Auteur Sujet: Thread: il semblerait que ma méthode de classe soit prise pour un foncteur...  (Lu 2760 fois)

0 Membres et 1 Invité sur ce sujet

Oettam

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
    • E-mail
Bonjour à tous!

Tout d'abord merci beaucoup de m'accorder deux trois minutes; je serai bref.

Je commence avec la sfml et je me suis lancé dans le multithreading mais je me suis vite retrouvé avec mon compilateur qui m'insultait   >:( Voici mon code:

Je ne vous donne que les quelques méthodes qui me semblaient les plus importantes. S'il y a autre chose qui vous intéresse dites le moi sans autre. C'est ma classe menu qui s'occupe du... menu! Je l'instancie dans mon application et je la lance avec la méthode launch, qui elle-même lance les threads render et loop.

// constructeur
Menu::Menu(RenderWindow *fn) : m_fondTexture(), m_boutons(), m_fond(), m_play(), m_options(), m_rendering(&Menu::render, this), m_looping(&Menu::loop, this) {
   m_fenetre = fn;
   m_open = false;
}

// lorsqu'on veut lancer le menu.
void Menu::launch() {
    m_open = true;

    m_rendering.launch();
    m_looping.launch();

    while (isOpen()) {
        while (m_fenetre->pollEvent(m_event)) {
            events();
        }
    }
}

// thread pour les calculs.
void Menu::loop() {
    while (isOpen()) {
        for (int i(0); i < boutons.size(); i++) {
            if (mouseOnSprite(boutons[i]))
                boutons[i]->setColor(Color::Black);
            else
                boutons[i]->setColor(Color::White);
        }
    }
}

// thread pour le rendu à l'écran.
void Menu::render() {    
    while (isOpen()) {
        m_fenetre->clear();
        m_fenetre->draw(m_fond);
        m_fenetre->draw(m_play);
        m_fenetre->draw(m_options);
   
        m_fenetre->display();
    }
}
 

Et lors de la compilation, ça me donne:
oettam@oettams:~/Documents/programmation/exilium/git/build$ make
[ 12%] Building CXX object CMakeFiles/../bin/exilium.dir/src/Menu.cpp.o
In file included from /home/oettam/Documents/programmation/libs/sfml2.0/include/SFML/System/Thread.hpp:193:0,
                 from /home/oettam/Documents/programmation/libs/sfml2.0/include/SFML/System.hpp:40,
                 from /home/oettam/Documents/programmation/exilium/git/src/Menu.hpp:2,
                 from /home/oettam/Documents/programmation/exilium/git/src/Menu.cpp:2:
/home/oettam/Documents/programmation/libs/sfml2.0/include/SFML/System/Thread.inl: In instantiation of ‘void sf::priv::ThreadFunctorWithArg<F, A>::run() [with F = void (Menu::*)()const; A = Menu*]’:
/home/oettam/Documents/programmation/exilium/git/src/Menu.cpp:88:1:   required from here
/home/oettam/Documents/programmation/libs/sfml2.0/include/SFML/System/Thread.inl:48:25: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘((sf::priv::ThreadFunctorWithArg<void (Menu::*)()const, Menu*>*)this)->sf::priv::ThreadFunctorWithArg<void (Menu::*)()const, Menu*>::m_function (...)’, e.g. ‘(... ->* ((sf::priv::ThreadFunctorWithArg<void (Menu::*)()const, Menu*>*)this)->sf::priv::ThreadFunctorWithArg<void (Menu::*)()const, Menu*>::m_function) (...)’
make[2]: *** [CMakeFiles/../bin/exilium.dir/src/Menu.cpp.o] Error 1
make[1]: *** [CMakeFiles/../bin/exilium.dir/all] Error 2
make: *** [all] Error 2
 

Même si je dois vous avouer que je ne comprends pas tout, je vois toutefois que g++ semble utiliser la méthode ThreadFunctorWithArg alors que je n'utilise aucun foncteur...

J'espère que mon erreur n'est pas totalement anodine (restons polis  ;) ) et je vous remercie encore de regarder tout ça.
Bonne fin de semaine,

Oettam

PS: Ah oui, question rien à voir: est-ce que quelqu'un pourrait me dire si Mouse::getPosition est considérée comme un événement? Car je l'utilise dans un thread autre que le principal (en fait, c'est justement la méthode mouseOnSprite du code ci-dessus) et je sais que cela peut causer des problèmes sous certains OS, comme Mac ou Windows.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Effectivement il y a un souci, mais impossible de trouver une quelconque erreur dans ce morceau de code. Du coup ce serait cool si tu pouvais écrire un code complet et minimal qui reproduit le problème. Dans ton cas c'est vraiment pas compliqué, ça devrait aller vite.

Pour Mouse::getPosition, ça devrait aller.

Par contre tu utilises trop, et mal, les threads. Pourquoi en mets-tu partout ?
Laurent Gomila - SFML developer

Oettam

  • Newbie
  • *
  • Messages: 2
    • Voir le profil
    • E-mail
Bonsoir,

Merci pour ta réponse!

Après quelques tests, j'ai remarqué que, tout bêtement et je ne sais toujours pas pourquoi, il suffisait de copier tous mes fichiers sources dans un autre dossier et recompiler, ce qui résolvait mon curieux problème.

J'ai eu cependant un autre problème ensuite (d'après un autre topic, je devrais lancer XInitThreads(), mais pourquoi ???). Bon, en tous cas, j'ai - suivant ton conseil - laissé tombé le multithreading, du moins pour le menu. Donc problème résolu!

Ah, juste par curiosité, pourrais-tu me dire pour quel genre de tâches tu utiliserais le multithreading? Car je crois que ça m'échape encore...
« Modifié: Mai 17, 2013, 10:00:11 pm par Oettam »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Citer
Ah, juste par curiosité, pourrais-tu me dire pour quel genre de tâches tu utiliserais le multithreading? Car je crois que ça m'échape encore...
Il n'y a pas de réponse toute faite à cette question. Je dirais juste que si tu ne sais pas quand les utiliser, alors ne les utilise pas. Utilise les le jour où tu sauras très exactement pourquoi tu en as besoin ;)
Laurent Gomila - SFML developer