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

Multithreading Discussion :

QThread a variables statiques


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut QThread a variables statiques
    Salut,

    Puisqu'une variable statique est partagée par toutes les instances d'une même classe, normalement elle serai partagée par toutes les instances de ma classe qui dérive de QThread. Dans mon cas ceci me pose problème puisque mes threads instance de la même classe vont accèder à cette variable statique en lecture et écriture simultanément. Je pourrai bien protéger cette variable avec des Mutex mais ceci rendra mes threads inutile puisque cette variable statique est utilisée en tout temps pendant le run du thread.
    Est ce qu'il y a un moyen de faire en sorte que chaque thread possède sa propre copie de cette variable statique ? ce qui la rendrai statique uniquement à l'intérieur du même thread !
    Je sais qu'utiliser une variable non statique est normalement la solution, mais certaines contraintes m'oblige à utiliser une variable statique.

    Merci

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Par défaut
    Merci Yan !
    Ca fonctionne. Voici le test que j'ai fait pour m'en assurer:
    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
     
    #ifndef _Thread_
    #define _Thread_
     
    #include <QThread>
    #include <QThreadStorage>
     
    class thread : public QThread 
    {
    	//Q_OBJECT
     
    public:
     
    	static QThreadStorage<int*> v;
    	int v1;
     
    protected:
    	virtual void run();
     
    private:
     
    };
     
    #endif
    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
     
    #include "thread.h"
    #include <QTime>
    #include <QtDebug>
     
     
    QThreadStorage<int*> thread::v;
     
    //----------------------------------------------------------------------------
    void thread::run()
    {
    	v.setLocalData(new int[1]);
    	v.localData()[0] = this->v1;
     
    	this->v1 = 5;
     
    	qDebug() << this->objectName() << "variable statique initialisee";
    	this->sleep(15);
     
    	qDebug() <<this->objectName() << v.localData()[0] ;
    }
    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
     
    #include <QApplication>
    #include "thread.h"
    #include <QtDebug>
    #include <QTime>
     
    using namespace std;
     
     
    int main(int argc, char *argv[])
    {
    	QApplication app(argc, argv);
     
    	thread t1;
    	t1.setObjectName("thread1");
    	thread t2;
    	t2.setObjectName("thread2");
     
    	t1.v1 = 1;
    	t2.v1 = 2;
     
    	t1.start();
    	t2.start();
     
    	QTime now;
    	now.start();
    	while(now.elapsed() < 5000)
    	{}
     
    	qDebug() << t1.v1 << " " << t2.v1;
     
    	return app.exec();
    }
    L'affichage que j'obtient est :
    "thread1" variable statique initialisee
    "thread2" variable statique initialisee
    5 5
    "thread1" 1
    "thread2" 2
    Ce qui montre bien que la même variable statique n'est pas partagée par les threads instance de la même classe grâce à QThreadStorage.

    J'ai mis Q_OBJECT en commentaire car j'avais des erreurs de compilation !
    LINK : debug\Qt Thread text.exe not found or not built by the last incremental link; performing full link
    1>main.obj : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall thread::metaObject(void)const " (?metaObject@thread@@UBEPBUQMetaObject@@XZ)
    1>main.obj : error LNK2001: unresolved external symbol "public: virtual void * __thiscall thread::qt_metacast(char const *)" (?qt_metacast@thread@@UAEPAXPBD@Z)
    1>main.obj : error LNK2001: unresolved external symbol "public: virtual int __thiscall thread::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@thread@@UAEHW4Call@QMetaObject@@HPAPAX@Z)

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/11/2006, 13h55
  2. Réponses: 14
    Dernier message: 05/09/2006, 01h17
  3. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35
  4. Utilisation d'une variable statique
    Par kurkaine dans le forum C++Builder
    Réponses: 6
    Dernier message: 14/06/2006, 13h49
  5. Exportation de variable statique
    Par Laurent Gomila dans le forum C++
    Réponses: 16
    Dernier message: 31/08/2005, 16h32

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