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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    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.

  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
    Ton lien de la FAQ ne semble pas bon.

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    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

  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
    Par défaut
    Pourrais-tu fournir un exemple minimal complet ?

  5. #5
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    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

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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