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 1620 fois)

0 Membres et 1 Invité sur ce sujet

Glân de Brylan

  • Jr. Member
  • **
  • Messages: 83
  • Je pense ce que je dis et le dis comme je le pense
    • Voir le profil
[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 »
Vous aussi, ayez chaque jour une pensée pour tous ces gamins qui s'imaginent faire un MMORPG touts seuls, et ce avant même d'avoir appris le C++.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • 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

  • Jr. Member
  • **
  • Messages: 83
  • Je pense ce que je dis et le dis comme je le pense
    • Voir le profil
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.
Vous aussi, ayez chaque jour une pensée pour tous ces gamins qui s'imaginent faire un MMORPG touts seuls, et ce avant même d'avoir appris le C++.

 

anything