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 :

Affichage de thread et concurrence des donn�es [D�butant(e)]


Sujet :

Threads & Processus C++

  1. #1
    Membre confirm�
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par d�faut Affichage de thread et concurrence des donn�es
    Bonjour,

    Voila je cherche a cr�e un objet dans un nouveau thread, cette objet contient des m�thodes, qui rel�vent des informations d'un poste de travail.
    JE cherche ensuite � afficher ces donn�es dans un m�mo.
    Mais comme j'ai environ 100 threads, lorsqu'il arrive a la m�thodes affiche(), il m�lange les informations, ou alors affiche une parti d'un, puis un autre puis la fin du 1ere.

    Je voudrais pouvoir le forcer � ex�cuter la fonction affiche d'un seul coup afin de n'afficher que les informations correspondantes a une seul machine.

  2. #2
    Membre �m�rite

    Profil pro
    Inscrit en
    D�cembre 2008
    Messages
    533
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 533
    Par d�faut
    Utilise un mutex pour restreindre � 1 seul thread � la fois les appels � affiche().
    Si affiche() est une m�thode, tu ajoutes un mutex dans tes attributs de classe et tu le verrouilles le temps de l'appel � affiche(). Sinon, m�me principe avec une variable globale que tu verrouilles au d�but de ta fonction.

  3. #3
    Membre confirm�
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par d�faut
    Merci de ta reponse,
    C'est ce que j'�ssai de fair, mais cela ne fonctionne pas correctement (surement me suis-je tromper dans la mise en place du mutex.)

    dans mon constructeur de l'objet j'ai placer :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     ghMutex = CreateMutex(
            NULL,              // default security attributes
            FALSE,             // initially not owned
            NULL);             // unnamed mutex
     
        if (ghMutex == NULL)
        {
            //cout<<"CreateMutex error: %d\n", GetLastError();
            Form1->Memo1->Lines->Add("mutex error");
            //return 1;
        }
        Affiche();
    puis dans la fonction affiche :

    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
     
           DWORD dwCount=0, dwWaitResult; 
           AnsiString Info;
           AnsiString Ip,Mac,Nom;
           switch (dwWaitResult)
           {
               // The thread got ownership of the mutex
               case WAIT_OBJECT_0:
                   __try {
                              Ip = CAddIp;
                              Mac = CAddMac;
                              Nom = CNomNetBios;
                              Info = Nom + "   " + Ip + "   " + Mac ;
                              Form1->Memo1->Lines->Add(Info);
                    }
     
                    __finally {
                        // Release ownership of the mutex object
                        if (! ReleaseMutex(ghMutex)) 
                        { 
                            // Handle error.
                           // Form1->Memo1->Lines->Add("handle error");
                        } 
                    } 
                    break; 
     
                // The thread got ownership of an abandoned mutex
                // The database is in an indeterminate state
                case WAIT_ABANDONED: 
                    Form1->Memo1->Lines->Add("erreur");
              }

  4. #4
    Membre �m�rite

    Profil pro
    Inscrit en
    D�cembre 2008
    Messages
    533
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 533
    Par d�faut
    A mon avis tu as copi�-coll� un code sans trop r�fl�chir.
    Tu cr�es un mutex ghMutex mais tu ne le verrouilles pas au d�but de affiche()
    Sauf erreur, je crois qu'il faudrait un WaitForSingleObject().

  5. #5
    Membre confirm�
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par d�faut
    Effectivement, je n'avais pas compris cela :/

    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
    void PosteDeTravail::Affiche()
    {
     
           AnsiString Info;
           AnsiString Ip,Mac,Nom;
           WaitForSingleObject(g_hMutex,INFINITE) ;
           __try
            {
               Ip = CAddIp;
               Mac = CAddMac;
               Nom = CNomNetBios;
               Info = Nom + "   " + Ip + "   " + Mac ;
               Form1->Memo1->Lines->Add(Info);
            }
           __finally
            {
               ReleaseMutex(g_hMutex);
            }
    }
    J'ai donc fait un WaitSingleForObjet, mais cela ne fonctionne toujours pas mieu .Je joint une copie d'ecran de ce que j'obtiens,
    Je devrais avoir sur chaque ligne "Nom + Addresse ip + Adresse MAc"

    exemple : Poste_CTRL 192.168.2.8 00:11:29...
    Pour chaque poste qui repond au ping
    Images attach�es Images attach�es  

  6. #6
    Membre �m�rite

    Profil pro
    Inscrit en
    D�cembre 2008
    Messages
    533
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 533
    Par d�faut
    Est-ce que chaque thread poss�de une instance de PosteDeTravail ?
    Si oui, �a signifie que tu as N instances de PosteDeTravail, qui g�rent N mutex vers 1 ressource unique (ton logger/afficheur), donc tes mutex en l'�tat ne servent � rien. Essaie plut�t d'allouer un mutex en static dans Affiche() :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void Affiche()
    {
    static HANDLE ghMutex = CreateMutex(NULL, FALSE, NULL);
    WaitForSingleObject(ghMutex, INFINITE) ;
     
    ...
     
    }

  7. #7
    Membre confirm�
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par d�faut
    Oui c'est exactement sa.

    JE comprend pas ce que cela change de le declarer en static, en faisant comme sa n'aurais-je pas un mutex par thread ?

  8. #8
    Membre �m�rite

    Profil pro
    Inscrit en
    D�cembre 2008
    Messages
    533
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 533
    Par d�faut
    En d�clarant en static, ghMutex sera un attribut de classe, au lieu d'un attribut d'objet (cf FAQ). Il sera donc unique, comme la ressource qu'il est cens� prot�ger.

  9. #9
    Membre confirm�
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par d�faut
    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
    void PosteDeTravail::Affiche()
    {
           AnsiString Info;
           AnsiString Ip,Mac,Nom;
     
           static HANDLE ghMutex = CreateMutex(NULL, FALSE, NULL);
            WaitForSingleObject(ghMutex, INFINITE) ;
     
          // WaitForSingleObject(g_hMutex,INFINITE) ;
           __try
            {
               //Ip = CAddIp;
               //Mac = CAddMac;
               //Nom = CNomNetBios;
               //Info = Nom + "   " + Ip + "   " + Mac ;
               //Form1->Memo1->Lines->Add(Info);
               Form1->Memo1->Lines->Add(CNomNetBios);
               Form1->Memo1->Lines->Add(CAddMac);
               Form1->Memo1->Lines->Add(CAddIp);
            }
           __finally
            {
               ReleaseMutex(ghMutex);
            }
    }
    Voila j'ai fais comme tu ma indiquer, mais cela ne fonctionne toujours pas, c'est toujours le bordezl lors de l'affichange

    je joint une copie d'ecran
    Images attach�es Images attach�es  

  10. #10
    Membre �m�rite

    Profil pro
    Inscrit en
    D�cembre 2008
    Messages
    533
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 533
    Par d�faut
    Tu as bien supprim� le ghMutex de tes attributs ?

  11. #11
    Membre confirm�
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par d�faut
    Comment ca ? est ce que je dois ajouter dans mon objet le handle ghMutex dans mes attributs priv� ?

  12. #12
    Membre �m�rite

    Profil pro
    Inscrit en
    D�cembre 2008
    Messages
    533
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2008
    Messages : 533
    Par d�faut
    Non, l'enlever justement.
    De m�me que l'init via CreateMutex dans le constructeur.

  13. #13
    Membre confirm�
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2012
    Messages
    146
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, C�te d'Or (Bourgogne)

    Informations professionnelles :
    Activit� : Developpeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2012
    Messages : 146
    Par d�faut
    Oui j'avais tout oter, je pense que cela fonctionne mais je dois avoir un probl�me au niveau du nom netbios, car je r�cup�re le bon , puis ensuite il est modifier( je ne sais pas ou ni comment ) en morceau d'adresse ip ou d'addresse MAc

Discussions similaires

  1. Synchronisation de thread (au niveau des donn�es)
    Par Celes_Vongola dans le forum Threads & Processus
    R�ponses: 2
    Dernier message: 24/08/2012, 12h15
  2. acc�der au thread et prendre des donn�es
    Par louay02 dans le forum D�buter
    R�ponses: 5
    Dernier message: 19/10/2011, 09h22
  3. affichage dynamique en fonction des donn�es en base
    Par jengo dans le forum Bases de donn�es
    R�ponses: 1
    Dernier message: 28/10/2004, 10h22
  4. TDBCtrlGrid - Affichage des donn�es
    Par audreyb dans le forum Bases de donn�es
    R�ponses: 1
    Dernier message: 24/10/2004, 13h10
  5. [JTable] Probl�me d'affichage des donn�es
    Par ddams dans le forum Composants
    R�ponses: 2
    Dernier message: 15/09/2004, 17h07

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