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