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 :

[Boost.Thread] Exécuter un thread avec une fonction membre


Sujet :

Boost C++

  1. #1
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut [Boost.Thread] Exécuter un thread avec une fonction membre
    Bonjour à tous !

    J'aimerai bien utiliser des Thread pour générer un film, afin que mon application puisse continuer à tourner, même si le calcul est assez "gourmand".
    Le truc, c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::thread my_thread(&genererFilm);
    ne prend pas d'arguments, et pas de fonctions membres non static.

    Mon code original est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void Camera::genererFilm(int image_debut, int image_fin, std::string nom_fichier)
    {
    	std::cout << "Generation d'un film en cours..." << std::endl;
    	std::ofstream file ( nom_fichier.c_str(), std::ios_base::binary);
    
    	for (int i = image_debut; i < image_fin; i++) {
    		if (isNumeroValide(i) ) {
    			vigra::UInt16Image image = getImage(i);
    
    			vigra::UInt16Image::const_iterator iter;
    			for (iter = image.begin(); iter != image.end(); iter++) {
    				file.write(reinterpret_cast<const char*>(iter), sizeof(vigra::UInt16));
    			}
    		}
    	}
    }
    En vert : les fonctions membres (non static)
    En orange: les paramètres passés à la fonction (attributs non membres)

    Je retourne le problème dans tous les sens, et je n'arrive pas à écrire quelquechose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Camera::CreerFilm(int image_debut, int image_fin, std::string nom_fichier)
    {
    	boost::thread my_thread(&genererFilm);	
    }
    Avez vous une astuce, une idée ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je suppose que le constructeur accepte n'importe quel boost::function<void ()>, donc ceci devrait faire l'affaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::thread my_thread(boost::bind(&genererFilm, this, image_debut, image_fin, nom_fichier));

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Apparemment, ce serait plutôt un boost::function0<void>.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    C'est exactement la même chose. La seule différence c'est que ma syntaxe (boost::function<void ()>) n'est pas supportée par les vieux compilos, mais après c'est le même type.

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    On peut le voir d'ailleurs dans le tuto officiel sur boost.function.

  6. #6
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::thread my_thread(boost::bind(&Camera::creerFilm, this,  image_debut, image_fin, nom_fichier));
    Comme ça, ça marche parfaitement! Je débute encore en Programmation concurrente.


  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    ?

  8. #8
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    J'ai pas mis le Tag tout de suite, car j'aurai voulu savoir pourquoi il fallait le Camera:: devant la fonction à appelée...

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Parce que tu dois spécifier à quelle classe appartient ta fonction membre... Et après, le "this", c'est pour l'instance sur laquelle tu veux appeler cette fonction membre.

    Edit : la doc de Boost.Bind explique très bien tout ça.

  10. #10
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    OK Super, c'est ce que je voulais savoir...


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

Discussions similaires

  1. [boost::thread] créer un thread sur une fonction membre.
    Par méphistopheles dans le forum Boost
    Réponses: 6
    Dernier message: 03/06/2009, 13h49
  2. Thread avec une fonction membre d'une classe
    Par Krishna dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 14/07/2008, 23h43
  3. accumlate avec une fonction membre 2
    Par yan dans le forum SL & STL
    Réponses: 23
    Dernier message: 23/08/2007, 23h09
  4. accumlate avec une fonction membre
    Par yan dans le forum SL & STL
    Réponses: 2
    Dernier message: 07/08/2007, 12h09
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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