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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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) ;
     
    ...
     
    }

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