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] modifier un objet


Sujet :

Boost C++

  1. #1
    Membre Expert
    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
    Par défaut [Boost.Thread] modifier un objet
    Bonjour à tous!
    Toujours pour m'initier à Boost.Thread, j'essaie actuellement de construire un Compteur dans un thread, que je remet à zéro dans le programme principal de temps en temps.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include <iostream>
    #include <string>
    #include <limits>
     
    #include <boost/thread/thread.hpp>
    #include <boost/bind.hpp>
     
    class Compteur
    {
    public :
    	Compteur(std::string nom) : m_compteur(0), m_nom_compteur(nom), continuer(true) {std::cout << "Creation d'un compteur : " << m_nom_compteur << std::endl;}
     
    	void incrementer();
    	void afficher() { std::cout << m_nom_compteur << " : " << m_compteur << std::endl; }
    	void reset() {m_compteur = 0;}
     
    private:
    	int m_compteur;
    	std::string m_nom_compteur;
    	bool continuer;
    };
     
    void Compteur::incrementer()
    {
    	while (continuer == true) {
    		m_compteur++;
    		afficher();
    	}
    }
     
     
    int main()
    {
    	Compteur comp1("Compteur 1");
    	boost::thread compteur1(boost::bind(&Compteur::incrementer, comp1));
     
    	int i = 0;
    	while(1)
    	{
    		if (i == 1000)
    		{
    			comp1.reset(); // Ne marche pas
    			std::cout << "Remise a Zero" << std::endl;
    			std::cout << "Appuyez sur entree pour continuer...";
    			std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    			i = 0;
    		}
    		i++;
    		std::cout <<"i = " << i << std::endl;
    	}
     
    	return 0;
    }
    Le problème est que je fourni au thread une fonction membre qui est interprétée comme une fonction et rien d'autre. Le fait d'appeler reset() ne va rien changer au fait que le compteur va continuer de s'incrémenter...

    Question : comment faire pour modifier l'objet ?



  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Normal, y'a des problèmes de concurrence...
    Tu ne peux pas simplement partager une variable entre plusieurs threads.

  3. #3
    Membre Expert
    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
    Par défaut
    Comment pourrait-on remettre à 0 le compteur qui se trouve dans un autre thread?

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Il faut mettre un mutex et stocker une référence vers ton compteur dans le thread principal et dans l'autre thread.

  5. #5
    Membre Expert
    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
    Par défaut
    Ok je vais essayer. Juste une question, quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::thread compteur1(boost::bind(&Compteur::incrementer, comp1));
    Est-ce que la fonction incrementer() est "liée" à l'objet comp1, ou bien la fonction incrementer vie sa vie toute seule?

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Elle est liée à comp1, naturellement

  7. #7
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Miles Voir le message
    Elle est liée à comp1, naturellement
    Non, la doc de boost::bind indique qu'ici qu'une copie interne de "comp1" est effectuée.

    Pour qu'elle soit liée à comp1, il faut lui donner un pointeur vers comp1, ou bien utiliser boost::ref. Je me suis déjà fait piéger comme ça .

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ah ? Zut, planté. En revanche, si on spécifie un passage par référence devrait fonctionner, non ?

  9. #9
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Miles Voir le message
    Ah ? Zut, planté. En revanche, si on spécifie un passage par référence devrait fonctionner, non ?
    En remplaçant ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::bind(&Compteur::incrementer, comp1)
    par l'un des 2 au choix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::bind(&Compteur::incrementer, &comp1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::bind(&Compteur::incrementer, boost::ref(comp1))
    Après si avec les threads ça marche... ?

  10. #10
    Membre Expert
    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
    Par défaut
    Merci beaucoup ! Du coup, mon programme fonctionne avec boost::ref. Le comp1.reset() remet bien à zéro l'attribut m_compteur, et comme il n'y a pas de copie, ça marche.


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

Discussions similaires

  1. [thread]modifier un composant graphique
    Par dark2 dans le forum SWT/JFace
    Réponses: 6
    Dernier message: 13/06/2006, 10h41
  2. Réponses: 6
    Dernier message: 21/05/2006, 20h37
  3. [Thread] Modifier objet static depuis thread
    Par orelero dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 19/04/2006, 17h09
  4. [debutant] run() dans l'objet thread ou l'objet cible ?
    Par slim dans le forum Concurrence et multi-thread
    Réponses: 2
    Dernier message: 18/01/2006, 23h06
  5. Modifier un objet dhtml
    Par roger_owc dans le forum ASP
    Réponses: 1
    Dernier message: 26/08/2005, 12h52

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