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

Threads & Processus C++ Discussion :

Thread et donnée d'une classe


Sujet :

Threads & Processus C++

  1. #1
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut Thread et donnée d'une classe
    Bonjour,

    J'ai trouvé cela dans la FAQ
    http://c.developpez.com/faq/cpp/?pag...onction_membre

    Ce fonctionne bien.

    Sauf que j'ai ajouté une donnée string dans ma classe. Lorsque j'essaie d'y écrire avant de lancer le thread c'est OK. Dans le thread, la donnée a un pointeur incorrect.
    J'ai bien protégé l'usage de ma donnée par mutex, c'est un problème d'accés.
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  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
    Points : 4 625
    Points
    4 625
    Par défaut
    Ton lien de la FAQ ne semble pas bon.
    Boost ftw

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    1°) Désolé:

    http://c.developpez.com/faq/cpp/?pag...onction_membre

    Remarque annexe, la gestion des threads est celle de ce site:

    http://emmanuel-delahaye.developpez....#helloworlds_1

    2°) Est-ce que une fois le thread lancé, il faut faire quelque chose
    de particulier pour utiliser une donnée de mon objet ?

    3°) Je suis sous Windows XP.
    - Visual C++ 2005 Express indique que ma string à un pointeur incorrect lorsque je la teste dans le thread.
    - Borland TurboC++ (le successeur du C++Builder) m'indique des valeurs différentes pour ma string.
    4°) Le code
    n'indique pas la même valeur pour this, lorsque je suis dans le programme appelant ou dans le thread, alors que c'est le même objet. Est-ce normal ?



    Merci
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  4. #4
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Pourrais-tu fournir un exemple minimal complet ?
    Boost ftw

  5. #5
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    859
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 859
    Points : 714
    Points
    714
    Par défaut
    Voici un example minimal:

    le .h
    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
     
    #ifndef CLASS_AVEC_THREAD
    #define CLASS_AVEC_THREAD
     
    #include <pthread.h>
     
    class classAvecThread
    {
    	public:
    		classAvecThread(void);
    		~classAvecThread(void);
     
    		string run(const string action, char* str);
    		string getStatus(void);
     
    		void setStatus(const string Status);
     
    	private:
            // Protection of status
            pthread_mutex_t mutexStatus;
            // Status of the access control : open, closed, blocked
            // Warning : "working" is used during when classAvecThread is not completed
    		string status;
    		// thread of opening
    		void OpenCall(void *pvParameter); // this can not be in the class because it's a C function
    		// http://c.developpez.com/faq/cpp/?page=fonctions#CLASS_pblm_pointeur_fonction_membre
    		// reinterpret_cast is used for incorporate in the function
    		static void *staticOpenCall(void *Param)
    		{
    			classAvecThread* Obj = reinterpret_cast<classAvecThread*>( Param );
    			Obj->OpenCall(Param);
    			return NULL;
    		}
    };
    #endif // CLASS_AVEC_THREAD
    le .cpp:

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
     
    #include "stdafx.h"
     
    #include <Windows.h>  // Sleep
     
    #include <string>
    #include <iostream>
    #include <sstream>
    using namespace std;
     
     
    string coucou;
     
    #include "classAvecThread.hpp"
     
     
    classAvecThread::classAvecThread(void)
    {
        status="init";
        mutexStatus = PTHREAD_MUTEX_INITIALIZER;
    }
     
    classAvecThread::~classAvecThread(void)
    {
    }
     
     
     
    void classAvecThread::setStatus(const string newStatus)
    {
    	cout << this << endl;
    	status = newStatus;
    }
     
    // Get the status of one access number "access"
    string classAvecThread::getStatus(void)
    {
    	cout << this << endl;
    	return status;
    }
     
    // http://c.developpez.com/faq/cpp/?page=fonctions#CLASS_pblm_pointeur_fonction_membre
     
    void classAvecThread::OpenCall(void *strclassAvecThread)
    {
        setStatus("hello");  // BUG ICI !!!!!
        // Faut bien faire quelque chose
        Sleep(300);
        // ne fonctionne pas
        setStatus("coucou"); 
        return;
    }
     
    // Open access number "access"
    string classAvecThread::run(const string action, char* strclassAvecThread)
    {
        pthread_mutex_lock (&mutexStatus);
        setStatus("coucou");
    	if (getStatus() != "work")
    	{
            setStatus("work");
        pthread_mutex_unlock (&mutexStatus);
    		// Start Thread of opening
            pthread_t ta;
    		pthread_create (&ta, NULL, classAvecThread::staticOpenCall, strclassAvecThread);
        }
        else
        {
        pthread_mutex_unlock (&mutexStatus);
        }
    	return status;
    }
    Le programme appelant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        class classAvecThread Essai;
     
        for(;;)
        {
            Essai.run("essai","essai");
        }
    Il est indispensable de lier la librairie de thread donné plus haut.

    Merci
    Si tu ne vis pas ce que tu penses alors tu penses ce que tu vis.

  6. #6
    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 : 39
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classAvecThread* Obj = reinterpret_cast<classAvecThread*>( Param );
    Si j'ai bien suivi ça va se traduire par ça à l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    classAvecThread* Obj = reinterpret_cast<classAvecThread*>( "essai" );
    D'où le plantage.

    Le paramètre passé à la fonction de création de thread doit être l'instance de la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_create (&ta, NULL, classAvecThread::staticOpenCall, this);
    Si tu veux passer plusieurs paramètres, il faudra passer un pointeur vers une structure qui les contient tous.

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

Discussions similaires

  1. Accès aux données d'une classe par plusieurs threads
    Par Dalini71 dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 08/12/2013, 07h23
  2. Réponses: 15
    Dernier message: 05/09/2006, 16h10
  3. Réponses: 8
    Dernier message: 04/04/2006, 17h29
  4. [Reflection] Exécuter une méthode donnée d'une classe
    Par schousso dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2004, 10h35
  5. Réponses: 6
    Dernier message: 03/03/2004, 14h31

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