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 Thread
FunctorWithArg 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.