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

Auteur Sujet: [Résolu]Étrange erreur, le retour  (Lu 2108 fois)

0 Membres et 1 Invité sur ce sujet

  • Invité
[Résolu]Étrange erreur, le retour
« le: Septembre 21, 2014, 12:36:50 pm »
Excusez-moi, mais je ne comprends pas cette erreur :

Citer
\SFML\System\Thread.inl||In instantiation of 'void sf::priv::ThreadFunctorWithArg<F, A>::run() [with F = void (Button::*)(sf::Event); A = Button*]':|
\Button.cpp|94|required from here|
\SFML\System\Thread.inl|48|error: must use '.*' or '->*' to call pointer-to-member function in '((sf::priv::ThreadFunctorWithArg<void (Button::*)(sf::Event), Button*>*)this)->sf::priv::ThreadFunctorWithArg<void (Button::*)(sf::Event), Button*>::m_function (...)', e.g. '(... ->* ((sf::priv::ThreadFunctorWithArg<void (Button::*)(sf::Event), Button*>*)this)->sf::priv::ThreadFunctorWithArg<void (Button::*)(sf::Event), Button*>::m_function) (...)'|
Button.h
#ifndef BUTTON_H
#define BUTTON_H

class Button : public sf::Sprite
{
    public:
        Button(absWindow *wparent, void(absWindow::*function)(), std::string const& adress, std::string const& adressO=std::string(), std::string const& adressL=std::string());

        void setParent(absWindow *wparent, void(absWindow::*function)());
        absWindow* getParent();
        void setActive(bool yay);
        void changeTextures(std::string const& adress, std::string const& adressO=std::string(), std::string const& adressL=std::string());
        void checkClicked(sf::Event event);
    private:
        absWindow *parent;
        sf::Texture texture, textureOver, textureLeaned;
        sf::Thread *triggered, *ccd;
        bool mouseOver, active;
};

#endif //BUTTON_H

Button.cpp
#include "Button.h"

Button::Button(absWindow *wparent, void(absWindow::*function)(), std::string const& adress, std::string const& adressO, std::string const& adressL) : \
    parent(wparent), texture(), textureOver(), textureLeaned(), \
    triggered(new sf::Thread(function, wparent)), ccd(new sf::Thread(&Button::checkClicked, this)), mouseOver(false), active(true)
{
    changeTextures(adress, adressO, adressL);

    ccd->launch();
}

void Button::setActive(bool yay)
{
    if(active && yay)
    {
        return;
    }
    else if(yay)
    {
        active=true;
        ccd->launch();
    }
    else
    {
        active=false;
        setTexture(sf::Texture());
    }
}

void Button::setParent(absWindow *wparent, void(absWindow::*function)())
{
    active=false;
    parent=wparent;
    delete triggered;
    triggered=new sf::Thread(function, parent);
    active=true;
    ccd->launch();
}

absWindow* Button::getParent()
{
    return parent;
}

void Button::changeTextures(std::string const& adress, std::string const& adressO, std::string const& adressL)
{
    texture.loadFromFile(adress);
    if(adressO == std::string())
        textureOver.loadFromFile(adress);
    else
        textureOver.loadFromFile(adressO);

    if(adressL == std::string())
        textureLeaned.loadFromFile(adress);
    else
        textureLeaned.loadFromFile(adressL);
}

void Button::checkClicked(sf::Event event)
{
    if(active && event.type==sf::Event::MouseMoved)
    {
        if(getGlobalBounds().contains(sf::Vector2<float>(event.mouseMove.x, event.mouseMove.y)))
        {//if the mouse is in the button...
            mouseOver=true;
            setTexture(textureOver);
        }
        else
        {

        }
    }
}//required frop here
 
« Modifié: Septembre 21, 2014, 02:12:50 pm par Glân de Brylan »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Étrange erreur, le retour
« Réponse #1 le: Septembre 21, 2014, 02:04:20 pm »
Ta fonction checkClicked prend un paramètre, or sf::Thread ne gère pas les paramètres pour les fonctions membres (cf. la doc et les tutoriels). En plus, d'où penses-tu que ce paramètre serait venu ? Tu ne le spécifies nulle part.

Sinon, ton utilisation des threads me paraît vraiment louche. Je pense que tu pourrais t'en passer et t'éviter beaucoup de problèmes.
Laurent Gomila - SFML developer

Glân de Brylan

  • Invité
Re : Étrange erreur, le retour
« Réponse #2 le: Septembre 21, 2014, 02:12:30 pm »
Arf, l'erreur du débutant. Effectivement l'utilisation d'un thread n'a rien à faire là.
À la abse je pensais faire une boucle avec pollEvent, en oubliant que ça ne peut se faire que dans le thread où a été créé la fenêtre...J'avais donc adopté l'idée de la méthode checkClicked() qui serait justement appelée depuis le thread en question, lui passant l'Event en paramètre.
Et j'ai complètement oublié d'enlever cette histoire de thread. J'ai honte.

 

anything