AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 [C++] bind() une méthode

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: [C++] bind() une méthode   Dim 30 Nov 2014 - 18:59

Salut, je commence à faire un peu de C++ avec la SFML, et je voudrais créer un thread avec une méthode d'une classe faite pour l'occasion. Bref, les thread de SFML utilisent bind() (qui, si j'ai bien compris, est une adresse de fonction (1er arg) avec des arguments (autres arg) en une variable), et je voudrais bind une méthode b d'une classe A.

Donc le problème, c'est de savoir comment récupérer l’adresse d'une méthode, tout simplement. J'ai cherché pendant tout l'après-midi et &A::b ne semble pas fonctionner, puisque le compilo (Visual studio 2012) me dit juste que ce que je pointe n'est pas une fonction de 3 arguments alors que si Yum! A moins qu'il n'accepte pas les méthodes?

J'ai cherché toute la journée sur les forums et je n'ai trouvé aucune solution.

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8902
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: [C++] bind() une méthode   Dim 30 Nov 2014 - 19:04

Faut aussi que tu passes un pointeur de ton instance.
Sans instance, pas d’exécution de méthode possible (a part si elle est statique).

Quand au threads, maintenant que le standard C++11 est supporté par tous les compilos connus, je te conseille vivement d'utiliser les std::thread.
C'est plus standard, plus puissant, et mieux fichu que les sf::Thread. L'auteur le dit lui même d'ailleurs, il a laissé cette classe uniquement pour la retro compatibilité (et ceux qui doivent programmer avec un vieux compilo).

D'ailleurs y a plein d'exemples d'utilisation des threads sur cplusplus.com.

_________________
                 
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: [C++] bind() une méthode   Dim 30 Nov 2014 - 19:51

Je pensais que les thread de la lib standard étaient beaucoup plus compliqués que les thread SFML, visiblement non ^^
Par contre j'ai un soucis :
Code:
#include "stdafx.h";
#include "render.h";

#include <iostream>
#include <thread>

#include <SFML\Graphics.hpp>
#include <SFML\Window.hpp>

using namespace std;

rendering::rendering(unsigned int winwidth, unsigned int winheight, unsigned int fps)
{
 thread thr_render(&rendering::renderer, winwidth, winheight, fps);
}

void rendering::renderer(unsigned int winwidth, unsigned int winheight, unsigned int fps)
{
 cout << "[i] Rendering thread initialized" << endl;
 
 sf::RenderWindow window(sf::VideoMode(winwidth, winheight), "WorldBuilder", sf::Style::Resize);
 window.setFramerateLimit(fps);
 sf::Event event;
 while (window.isOpen())
 {
 while (window.pollEvent(event))
 {
 if (event.type == sf::Event::Closed)
 window.close();
 }
 window.clear();
 window.display();
 }
}
Le compilo me retourne l'erreur C2661 en disant :
Code:
'std::thread::thread' : aucune fonction surchargée ne nécessite 4 arguments

Pourtant il y a bien 3 arguments pour la méthode renderer, pourtant ça a bien l'air comme ça sur l'exemple de cplusplus.com (merci pour la perle d'ailleurs) :
Code:
std::thread first (foo);     // spawn new thread that calls foo()
std::thread second (bar,0);  // spawn new thread that calls bar(0)

Je me suis gourré quelque part? :s

Edit : J'ai oublié de virer un constructeur sans argument du header. Du coup, avec le même code, j'ai l'erreur C2064 du fichier 'functional' alors que je l'ai retiré des #include (il y en avait besoin pour bind())... C'est une dépendance ou un truc du genre? Et c'est quoi l'erreur du coup? :s

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8902
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: [C++] bind() une méthode   Dim 30 Nov 2014 - 20:09

Faut passer le pointeur de ton instance au thread.

Code:
#include <iostream>
#include <thread>

class A {
    std::thread t;
   
public:
    A():t() {}
   
    ~A() {
        if(t.joinable())
            t.join();
    }
   
    void func(int a, int b) {
        std::cout << a << " " << b << std::endl;
    }
   
    void launch_thread() {
        if(t.joinable())
            t.join();
        t = std::thread(&A::func, this, 1, 2);
    }
};

int main()
{
    A ins;
    ins.launch_thread();
   
    return 0;
}

Par contre fais gaffe, les fonctions graphiques tu peux les executer que dans le thread principal, car c'est lui qui est relié au contexte graphique.
Donc ce que tu veux faire, ça va planter :p

_________________
                 
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: [C++] bind() une méthode   Jeu 4 Déc 2014 - 20:31

Salut et déso du temps du réponse,

J'ai pas compris le A():t(). J'ai un peu continué dans le tuto de c++ que je suis et j'ai pas trouvé à quoi ça correspond. Je dois faire quoi dans mon cas? o:

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1608
Localisation : Montpellier

MessageSujet: Re: [C++] bind() une méthode   Jeu 4 Déc 2014 - 21:08

C'est simplement la liste d'initialisation du constructeur, qui initialise (d'oh) les attributs ;)

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: [C++] bind() une méthode   Ven 5 Déc 2014 - 11:45

Ah bah oui j'ai complétement oublié ça, pourtant je le savais ^^

Par rapport au crash que ça créerait, j'ai lu que ça ne s'applique que pour OSX (Et ce, je m'en fous) sur la doc de SFML.
Mais visiblement non car la fenêtre crée est noire et ne dispose pas de bouton. Bref, est-ce que l'on peut déplacer ce contexte dans un autre thread?

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8902
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: [C++] bind() une méthode   Ven 5 Déc 2014 - 11:53

Yep, faut utiliser Window::setActive.
Voir tout en bas de cette page: http://www.sfml-dev.org/tutorials/2.0/graphics-draw.php

_________________
                 
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: [C++] bind() une méthode   

Revenir en haut Aller en bas
 
[C++] bind() une méthode
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» courber les cils...nouvelle méthode???
» La Méthode G.E.D de Mark Forster
» 5 Photos Fascinantes Utilisant la Méthode Tilt-Shift
» Méthode de singapour mathématiques
» méthode Pantley

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Programmation-
Sauter vers: