AccueilAccueil  FAQFAQ  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  Connexion  
-29%
Le deal à ne pas rater :
PC portable – MEDION 15,6″ FHD Intel i7 – 16 Go / 512Go (CDAV : ...
499.99 € 699.99 €
Voir le deal

 

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

Aller en bas 
3 participants
AuteurMessage
Asu
Utilisateur confirmé: Rang ****
Asu


Messages : 895

[C++] bind() une méthode Empty
MessageSujet: [C++] bind() une méthode   [C++] bind() une méthode EmptyDim 30 Nov 2014 - 19: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
onilink_


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

[C++] bind() une méthode Empty
MessageSujet: Re: [C++] bind() une méthode   [C++] bind() une méthode EmptyDim 30 Nov 2014 - 20: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.

_________________
[C++] bind() une méthode Runningpotato1[C++] bind() une méthode TvF6GED [C++] bind() une méthode MdetltS
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
Asu


Messages : 895

[C++] bind() une méthode Empty
MessageSujet: Re: [C++] bind() une méthode   [C++] bind() une méthode EmptyDim 30 Nov 2014 - 20: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
onilink_


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

[C++] bind() une méthode Empty
MessageSujet: Re: [C++] bind() une méthode   [C++] bind() une méthode EmptyDim 30 Nov 2014 - 21: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

_________________
[C++] bind() une méthode Runningpotato1[C++] bind() une méthode TvF6GED [C++] bind() une méthode MdetltS
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
Asu


Messages : 895

[C++] bind() une méthode Empty
MessageSujet: Re: [C++] bind() une méthode   [C++] bind() une méthode EmptyJeu 4 Déc 2014 - 21: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 *****
D-z


Messages : 1611
Localisation : Montpellier

[C++] bind() une méthode Empty
MessageSujet: Re: [C++] bind() une méthode   [C++] bind() une méthode EmptyJeu 4 Déc 2014 - 22: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 ****
Asu


Messages : 895

[C++] bind() une méthode Empty
MessageSujet: Re: [C++] bind() une méthode   [C++] bind() une méthode EmptyVen 5 Déc 2014 - 12: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
onilink_


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

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

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

_________________
[C++] bind() une méthode Runningpotato1[C++] bind() une méthode TvF6GED [C++] bind() une méthode MdetltS
Revenir en haut Aller en bas
Contenu sponsorisé





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

Revenir en haut Aller en bas
 
[C++] bind() une méthode
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [3D] Animation - Méthode ?
» la méthode pour maigrir
» Quel est votre méthode de travail.
» Méthode pour transmettre des données à au .exe
» [Jeu type Penalty] Aide pour la méthode

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