Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - Oettam

Pages: [1]
1
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...

2
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.

Pages: [1]