| [C++] bind() une méthode | |
|
|
Auteur | Message |
---|
Asu Utilisateur confirmé: Rang ****
![Asu](https://2img.net/u/3412/18/80/54/avatars/1813-65.gif)
Messages : 895
![[C++] bind() une méthode Empty](https://2img.net/i/empty.gif) | Sujet: [C++] bind() une méthode Dim 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!](/users/3412/18/80/54/smiles/796934.gif) 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
|
|
![Aller en bas](https://2img.net/i/empty.gif) | |
onilink_ Modérateur
![onilink_](https://2img.net/u/3412/18/80/54/avatars/1012-85.png)
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
![[C++] bind() une méthode Empty](https://2img.net/i/empty.gif) | Sujet: Re: [C++] bind() une méthode Dim 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. |
|
![Aller en bas](https://2img.net/i/empty.gif) | |
Asu Utilisateur confirmé: Rang ****
![Asu](https://2img.net/u/3412/18/80/54/avatars/1813-65.gif)
Messages : 895
![[C++] bind() une méthode Empty](https://2img.net/i/empty.gif) | Sujet: Re: [C++] bind() une méthode Dim 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
|
|
![Aller en bas](https://2img.net/i/empty.gif) | |
onilink_ Modérateur
![onilink_](https://2img.net/u/3412/18/80/54/avatars/1012-85.png)
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
![[C++] bind() une méthode Empty](https://2img.net/i/empty.gif) | Sujet: Re: [C++] bind() une méthode Dim 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 |
|
![Aller en bas](https://2img.net/i/empty.gif) | |
Asu Utilisateur confirmé: Rang ****
![Asu](https://2img.net/u/3412/18/80/54/avatars/1813-65.gif)
Messages : 895
![[C++] bind() une méthode Empty](https://2img.net/i/empty.gif) | Sujet: Re: [C++] bind() une méthode Jeu 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
|
|
![Aller en bas](https://2img.net/i/empty.gif) | |
D-z Utilisateur confirmé: Rang *****
![D-z](https://2img.net/u/3412/18/80/54/avatars/1588-46.png)
Messages : 1611 Localisation : Montpellier
![[C++] bind() une méthode Empty](https://2img.net/i/empty.gif) | Sujet: Re: [C++] bind() une méthode Jeu 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.
|
|
![Aller en bas](https://2img.net/i/empty.gif) | |
Asu Utilisateur confirmé: Rang ****
![Asu](https://2img.net/u/3412/18/80/54/avatars/1813-65.gif)
Messages : 895
![[C++] bind() une méthode Empty](https://2img.net/i/empty.gif) | Sujet: Re: [C++] bind() une méthode Ven 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
|
|
![Aller en bas](https://2img.net/i/empty.gif) | |
onilink_ Modérateur
![onilink_](https://2img.net/u/3412/18/80/54/avatars/1012-85.png)
Messages : 9180 Localisation : Montpellier Projet Actuel : Planet Centauri
OniDev
![[C++] bind() une méthode Empty](https://2img.net/i/empty.gif) | Sujet: Re: [C++] bind() une méthode Ven 5 Déc 2014 - 12:53 | |
| |
|
![Aller en bas](https://2img.net/i/empty.gif) | |
Contenu sponsorisé
![[C++] bind() une méthode Empty](https://2img.net/i/empty.gif) | Sujet: Re: [C++] bind() une méthode ![[C++] bind() une méthode Empty](https://2img.net/i/empty.gif) | |
| |
|
![Aller en bas](https://2img.net/i/empty.gif) | |
| [C++] bind() une méthode | |
|