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

MFC Discussion :

comment utiliser une section critique avec les mfc?


Sujet :

MFC

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 110
    Points : 59
    Points
    59
    Par défaut comment utiliser une section critique avec les mfc?
    Bonjour,

    tout est dis dans la question!! j'ai trouvé ce cour theoriquesur le net. mais c'est pas detaillé!! j'ai pas su comment l'appliquer en mfc!

  2. #2
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    voila ce que j'ai fait (apres de longue recherche sur le net!!)

    dans maclasse.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include <afxmt.h>
    static CCriticalSection sc;
    dans maclasse.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CCriticalSection maclasse::sc;
    sc.Lock();
    // section critique: les instructions faites par un seul thread a la fois
    sc.Unlock();
    apparament ça marche bien!!
    j'aimerai bien que quelqu'un me corrige si j'ai tort!

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    C'est tout bon

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Merci pour la confirmation

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    C'est tout bon, mais tu pourrais encore aller plus loin avec un objet lock

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class CMyLock
    {
       public:
       inline CMyLock(CCriticalSection & CS) { m_cs = CS; m_cs.Lock(); }
       inline ~CMyLock(void) { m_cs.Unlock(); }
     
       private:
    CCriticalSection & m_cs;
    }
    ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static CCriticalSection sc;
     
    {
       CMyLock lock(sc);   // lock la section critique et le destructeur se charge de delocker la section critique
    }
    Code non testé, c'est juste l'idée.

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    je vois pas trop comment le faire!!

    en plus j'ai un petit soucie, lorsque je met 2 section critique l'une a la suite de l'autre;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sc1.Lock();
    //sc1
    sc1.Unlock();
    sc2.Lock();
    //sc2
    sc2.Unlock();
    j'obtient le meme message d'erreur que j'obtenait avant de mettre la section critique!! la seule diff c'est qu'il met plus de temps pour m'envoyer le message!

    comment pouvez vous expliquez ça?

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par Djawida Voir le message
    j'obtient le meme message d'erreur que j'obtenait avant de mettre la section critique!! la seule diff c'est qu'il met plus de temps pour m'envoyer le message!
    C'est quoi le message d'erreur ?

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    Debug assertion failed !

    Program: monProgram.exe
    File: dbgheap.c
    Line: 1044

    Expression: _ctlIsValidHeapPointer(pUserData)


    nb: a l'interieur de ma section critique je fais des requetes MYSQL!! (je pense pas que c'est la cause mais sait on jamais!!)

  9. #9
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    mauvaise gestion des connections/déconnections à mon avis

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je ne pense pas que le problème soit lié aux sections critiques.

    Tu as un bout de code qui va probablement "jardiner" là où il n'a pas le droit. Il va falloir debugger et chercher ton problème. Malloc trop petit, ecriture en ehors d'un bloc alloué, ...

  11. #11
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    j'ai pas su comment localiser ou est mon probleme!!
    si g un seul thread --> aucun probleme
    plusieur thread avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sc.lock()
    //inst1
    //inst2
    sc.Unlock();
    --> aucun probleme

    plusieur thread avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sc1.lock()
    //inst1
    sc1.Unlock();
    sc2.Lock()
    //inst2
    sc2.Unlock();
    --> Debug assertion failed!

  12. #12
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    ça semble être passé inaperçu donc je répète :
    mauvaise gestion des connections/déconnections à mon avis
    en effet :
    1 thread = 1 connec + 1 déco
    2 threads = 1 connec + 1 déco + 1 connec + 1 déco

    Commence par vérifier où est l'assertion, mais à mon avis c'est lié à la 2ème connexion.

  13. #13
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    je fais plusieur fois dans le code et dans differente methodes des requete mysql!!
    dois je mettre chaque requete dans une section critique? ou ça n'a rien avoir?

    je vois pas trop comment gérér ces connection et deconnections autrement!!

  14. #14
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Je ne te parles pas de tes requêtes mais de la création et de la destruction de ton objet de connexion. Le plus simple est à mon avis (si c'est possible) de le mutualiser afin qu'il soit créé une seule fois avant les sections critiques et détruit après.

  15. #15
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    je sais pas si je t'ai bien compris, mais je pense que tu veux dire qu'il faut d'abord etablire la connection puis apres creer les thread!!

    main en fait j'ai besoin que chaque thread etabli sa propre connexion sur une base de donnée differente!!

    je sais pas si tu vois ce que je veux dire?

  16. #16
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    main en fait j'ai besoin que chaque thread etabli sa propre connexion sur une base de donnée differente!!
    ok d'où mon "si c'est possible"
    peux-tu montrer ton code ?

  17. #17
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 110
    Points : 59
    Points
    59
    Par défaut
    voila a quoi ressemble le code:

    classe1: je creer N instance de classe2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    classe2** ensembleThread= new classe2*[];
    for (i=1; i<=n; i++)
    	{
    		m_ptab= new classe2();
    		ensembleThread[i]=m_ptab;
    	}
    classe2:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    void classe2:: methode1() // on_click pour connecter
    {
          // inst pour prendre qlq valeur de l'ihm
          methode2();
    }
     
    void classe2::methode2()
    {
          methode3();
          methode4();
          methode5();// creation de thread pour chaque instance
    }
     
    void classe2::methode3()
    {
           MyData = mysql_init(NULL);
           mysql_real_connect();
    }
     
    void classe2::methode4()
    {
          res=mysql_list_dbs(MyData, NULL);
          mysql_free_result(res);
    }
     
    void classe2::methode5()
    {
           DWORD ThreadId;
           m_hThread = CreateThread( 
                NULL,              
                0,             
    	classe2::MyThread,
                (LPVOID)this,      
                0,                
                &ThreadId);
    }
    DWORD WINAPI classe2::MyThread( LPVOID lParam )
    {
            //.....
     
            section_critique1.Lock();
            mysql_real_query(...);
            section_critique1.Unlock();
     
           //....
     
           section_critique2.Lock();
           mysql_select_db(..);
           section_critique2.Unlock();
     
           //....
     
           section_critique3.Lock();
           mysql_real_query(..);
           section_critique3.Unlock();
     
          //.....
     
          while(condition)
          {
     
                  section_critique4.Lock();
                  mysql_real_query(..);
                  section_critique4.Unlock();
     
           }
     
    }
     
    void classe2::methode6() // on_click pour se deconnecter
    {
            section_critique5.Lock();
            mysql_close(MyData);
            MyData = NULL;
            section_critique5.Unlock();
    }
    nb: j'obtient le bogue sans appuyer sur le bouton de deconnection

Discussions similaires

  1. Réponses: 15
    Dernier message: 23/03/2009, 16h07
  2. comment utiliser une library C avec g++
    Par pichouss dans le forum C++
    Réponses: 4
    Dernier message: 22/05/2008, 18h08
  3. Comment utiliser une datasource JNDI avec JDBC?
    Par KING_OF_GRACELAND dans le forum JDBC
    Réponses: 6
    Dernier message: 08/04/2008, 18h18
  4. Réponses: 1
    Dernier message: 03/05/2006, 10h49
  5. Charger et afficher une image jpg avec les mfc
    Par glop - pas glop dans le forum MFC
    Réponses: 3
    Dernier message: 11/02/2004, 18h59

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