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 :

[Débutant] Mutex et pointeurs


Sujet :

Multithreading

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mai 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut [Débutant] Mutex et pointeurs
    Salut!

    Je fais un petit programme avec Qt, ayant un thread principal (pour l'UI), et un thread pour le calcul.

    Le problème est que mon thread dédié aux calculs manipule un tableau (via son pointeur), et que le thread principal doit afficher périodiquement les valeurs à l'écran.


    Si j'utilise un QMutex dans le thread du calcul, puis-protéger les donnés liées aux pointeur?

    voici le code du thread dédié aux calculs pour mieux vous expliquer mon problème:
    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
    #define MAX 10
    class Thread : public QThread
    {
        Q_OBJECT
     
    public:
        Thread(){for(int i=0; i<MAX; i++) x[i]=0;}
     
    private:
        int x[MAX];
        QMutex mutex;
     
    signals:
        sendP(int*, int);
     
    protected:
        void run(){
            for(;;)
            {
                QMutexLocker locker(&mutex); // Est-ce que x[0] à x[10] sont protégé?
                for(in i=0; i<MAX; i++)
                    x[i]+=3;
            }
            emit sendP(x, MAX)
        }
    };
    et voici une portion de code de l'UI:
    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
     
    MainWidget::MainWidget(QWidget * parent)
        :QWidget(parent)
    {
        //... intialisation
        thread = new Thread;
        connect(thread, SIGNAL(sendP(int*, int)), this, SLOT(receiveP(int*, int)));
        thread->start();
        //...
    }
     
    MainWidget::receiveP(int*x, int s)
    {
        for(int i=0; i<s; i++)
            qDebug() << x[i] 
        // je dois avoir à l'écran 10 valeurs identiques
    }

    Et si j'enlève le mutex de la classe Thread pour le mettre dans le slot receiveP(int*, int), cela marchera?

    Merci

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Bonjour,
    Citation Envoyé par rs485 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        void run(){
            for(;;)
            {
                QMutexLocker locker(&mutex); // Est-ce que x[0] à x[10] sont protégé?
                for(in i=0; i<MAX; i++)
                    x[i]+=3;
            }
            emit sendP(x, MAX)
        }
    Sa n'as pas trop de sens car ton emit sendP(x, MAX) ne sera jamais exécuté.

    Donc je suppose que sa doit plutôt ressembler a sa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void run(){
        for(;;)
        {
    	{
    	    QMutexLocker locker(&mutex); // Est-ce que x[0] à x[10] sont protégé?
    	    for(in i=0; i<MAX; i++)
    		x[i]+=3;
    	}
    	emit sendP(x, MAX);
        }
    }
    de plus :

    Citation Envoyé par rs485 Voir le message
    MainWidget::receiveP(int*x, int s)
    {
    for(int i=0; i<s; i++)
    qDebug() << x[i]
    // je dois avoir à l'écran 10 valeurs identiques
    }
    Tu ne lock pas le mutex ici ! Il n'attendra donc pas que tout le tableau soit incrémenté pour affiché et je suppose que tu obtient parfois des valeurs différentes (sans compter les risques d'accès concurrents).

    tu doit rajouter ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    MainWidget::receiveP(int*x, int s)
    {
        QMutexLocker locker(&thread->mutex); 
        for(int i=0; i<s; i++)
            qDebug() << x[i];
        // je dois avoir à l'écran 10 valeurs identiques
    }
    Pour terminer je te conseil d'utiliser un QVector plutôt qu'un tableau à la C.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    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 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut,
    c'est pas comme cela qu'il faut faire.
    Regarde
    http://qt.developpez.com/doc/latest/...emaphores.html
    http://qt.developpez.com/doc/latest/...onditions.html

    Si c'est juste pour envoyer à l'affichage quelques valeurs de temps en temps, un simple signal devrais suffire. Pas besoin de mutex ou autre. Faut juste ne pas utiliser un pointeur brut comme cela.

    Si tu peut expliquer un peu plus ton besoin.

Discussions similaires

  1. [Débutant] Passage de pointeur et classe template
    Par guigouz dans le forum Langage
    Réponses: 3
    Dernier message: 18/04/2008, 14h58
  2. [débutant] tester un pointeur sur un objet
    Par hogan dans le forum C++
    Réponses: 26
    Dernier message: 30/03/2007, 10h02
  3. Réponses: 15
    Dernier message: 15/10/2006, 16h52
  4. [Débutant]Vecteur de pointeurs
    Par @r$£~%[ dans le forum C++
    Réponses: 18
    Dernier message: 09/08/2005, 16h19
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

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