IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Signal et Slot - Passage d'argument(s)


Sujet :

Boost C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 50
    Points : 59
    Points
    59
    Par défaut Signal et Slot - Passage d'argument(s)
    Bonjour...

    Pour information, je viens du monde de C#.
    Je suis obligé de programmer en C++ cette fois-ci.

    Bon, en C#, j'utilise souvent la classe WebClient... J'ai réussi à créer la même chose avec C++ et Boost.

    Maintenant, je veux créer des évènements du type :
    -DownloadCompleted
    -DownloadFailed

    Dans le 1er, je veux passer en argument le buffer contenant les données téléchargées, dans le 2ème un string me donnant la nature de l'erreur...

    Donc par exemple ma classe suivante : NetDownload
    J'ai repris l'exemple de Boost::Signal2:: Document and Viewer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    class NetDownload
    {
    public :
    	typedef boost::signals2::signal<void(boost::asio::streambuf)>  TickDownloadCompleted;
    	boost::signals2::connection onDownloadCompleted(const TickDownloadCompleted::slot_type &suscriber);
     
    	typedef boost::signals2::signal<void(std::string)>  TickDownloadFailed;
    	boost::signals2::connection onDownloadFailed(const TickDownloadFailed::slot_type &suscriber);
     
    protected:
    	TickDownloadCompleted mSignalDownloadCompleted;
    	TickDownloadFailed mSignalDownloadFailed;
    }
    Alors, quand le téléchargement se passe correctement, j'appelle mSignalDownloadCompleted(buffer); (buffer étant du type boost::asio::streambuf).
    Quand le téléchargement échoue, j'appelle mSignalDownloadFailed("Erreur");.

    Voila pour la classe NetDownload...

    J'ai une autre classe qui gère NetDownload, nommée NetClient

    Le fichier entête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class NetClient
    {
    public :
        NetClient();
        ~NetClient();
     
        void Start(std::string);
     
    private:
    void DownloadCompletet(boost::asio::streambuf);
    }
    Le fichier CPP:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void NetClient::Start(std::string url)
    {
    	boost::asio::io_service io_service;
     
    	NetDownload client(io_service, url);
    	client.onDownloadCompleted(boost::bind(&NetClient:: DownloadCompleted,this, -1));
     
    }
     
    void NetCLient:: DownloadCompleted(boost::asio::streambuf buf)
    {
    ...
    }
    Lors de la compilation, Visual Studio me dit un truc incompréhensible pour ma petite tête de DotNet :
    error C2664: 'void boost::_mfi::mf1<void,Net::NetClient,boost::asio::streambuf>::operator ()(T *,A1) const' : impossible de convertir l'argument 2 de 'int' en 'boost::asio::streambuf' c:\boost_1_56_0_x86\include\boost\bind\bind.hpp
    Je sais que mon erreur vient de là : client.onDownloadCompleted(boost::bind(&NetClient:: DownloadCompleted,this, -1));

    Auriez-vous une quelconque piste à ma soumettre ? Parce que lors de mes essais sans passage d'argument, mon code fonctionne...
    Bon, je continue mes recherches.

    Merci d'avance...

    Davy

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 50
    Points : 59
    Points
    59
    Par défaut
    Bon,

    je me suis rendu compte que j'avais une petite erreur de saisie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client.onDownloadCompleted(boost::bind(&NetClient:: DownloadCompleted,this, -1));
    La bonne écriture est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    client.onDownloadCompleted(boost::bind(&NetClient:: DownloadCompleted,this, _1));
    Mais cela n'améliore pas mes problèmes, d'autres apparaissent...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 50
    Points : 59
    Points
    59
    Par défaut
    Re bon,

    C'est cool, je fais mon auto-critique,

    pour mon autre erreur que j'avais lors de ma compilation :
    error C2248: 'boost::asio::detail::noncopyable::noncopyable' : impossible d'accéder à private membre déclaré(e) dans la classe 'boost::asio::detail::noncopyable' c:\boost_1_56_0_x86\include\boost\asio\basic_streambuf.hpp
    J'utilise : boost::asio::streambuf.
    Je dois mettre ce truc "&" après chaque définition : boost::asio::streambuf& ...

    Je viens de DotNet, ne l'oubliez pas !!!!

    A+

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    ce truc, le &, est une référence, c'est à dire que l'objet indiqué ne sera pas copié, mais bien directement manipulé.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 50
    Points : 59
    Points
    59
    Par défaut
    Bonjour...

    Merci pour l'info.
    Je vais prendre les tutos fournis sur ce site et étudier...

    Bonne journée...

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Pense aussi à notre FAQ, qui est une grosse mine d'information aussi.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [QtCore] Passage d'argument signal / slot
    Par Neitsa dans le forum PyQt
    Réponses: 2
    Dernier message: 22/09/2011, 15h20
  2. [JAVASCRIPT] passage d'argument à une fonction
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/06/2005, 18h17
  3. [TASM] Passage d'argument à une macro
    Par sorry60 dans le forum Assembleur
    Réponses: 13
    Dernier message: 23/04/2005, 18h22
  4. [web] passage d'arguments à un CGI
    Par ma2th dans le forum Web
    Réponses: 4
    Dernier message: 20/08/2004, 12h18
  5. passage d'argument à la procédure main ()
    Par Zazeglu dans le forum C
    Réponses: 5
    Dernier message: 01/09/2003, 19h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo