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 :

Problème de synchronisation...


Sujet :

MFC

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Problème de synchronisation...
    Bonjour,

    Je suis à la recherche d'une solution pour remedier au problème suivant.

    Je developpe une appli SDI.
    Dans la fonction InitInstance de ma classe app je lance un Timer
    (timeSetEvent(40,wTimerRes,Timer_precis,(DWORD) this,TIME_PERIODIC))
    qui apelle la fonction Timer_precis toutes les 40 ms.
    Cette fonction execute différentes opérations sur les variables d'une classe A par l'intermédiare d'un pointeur (pA).

    Jusque la tout va bien.

    Lorsque je clic sur un bouton, je dois détruire cette classe A, et en construire une nouvelle (delete pA; pA = new A.

    Comment je peux faire pour synchroniser tous ça.



    Merci

  2. #2
    Membre habitué Avatar de CriPpLe
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 157
    Points : 125
    Points
    125
    Par défaut
    Salut

    Tu veux synchroniser quoi ? la creation du timer, avec l'appel de ta classe....

    Soit un peu plus précis s'il te plait

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Non.
    Vu que les 2 fonctions travaillent sur la même classe,
    Si je ne fais rien, ça va mal.

    Par synchroniser je veux dire qu'il ne faut pas que les 2 fonctions s'executent en même temps (fonction du Timer et de mon bouton).

  4. #4
    Membre habitué Avatar de CriPpLe
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 157
    Points : 125
    Points
    125
    Par défaut
    Tu pourrais faire un truc du genre, bool bStatut;
    Quand ton timer lance la fonction, au début de celle ci, ton bStatut est à 1 et à la fin à 0.

    Et dans ta fonction liée à ton bouton, while(bStatut == 1) tu lui fais attendre, et dès que celui ci est à 0 là tu peux détruire l'objet A et le reconstruire.

    C'est un truc comme ça que tu veux ?

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    le plus sur etant d'utiliser les objets de synchros à notre disposition,
    ici l'emploi de section critique est adapté :

    declare une section critique dans ta classe ou est geré le timer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CCriticalSection m_cSynchro;
    pour acceder a ton code securisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // verouillage
    	m_cSynchro.Lock();
    // acces aux données classe A
    	m_cSynchro.Unlock(); // liberation
    Attention stdafx.h doit contenir l'include #include <afxmt.h>
    le programme doit etre réglé en multithread (onglet C++ use run-time library)

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    J'ai deja essaye tous ça.

    Quand j'appuie sur mon bouton, alors que ma fonction de timer est en train de s'executer (donc la section critique locké) le " m_cSynchro.Lock();" de ma fonction du bouton ne passe pas (normal), donc attends, mais cela fige mon appli, et plus rien ne se passe (le timer s'arrete, donc ne fait jamais "m_cSynchro.Unlock();" ...)

    Je ne sais plus quoi faire....

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    essaye de combiner ça avec CSingleLock
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CSingleLock singleLock(&m_cSynchro);
     
    // dans le bouton
    if (singleLock.IsLocked()) return;
    singleLock.Lock();
    // acces aux données
    singleLock.Unlock();
    pareil au niveau du timer.
    [edit]
    le meme singlelock pour les deux traitements bouton et timer
    [/edit]

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Ok ça bloque plus mon soft mais il faut avoir la chance d'appuyer sur le bouton quand ma fonction de timer n'est pas en train de s'executer, sinon l'appui sur mon bouton n'a aucun effet....

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    a toi de gerer la priorité , le bouton sur le timer ou le timer sur le bouton
    dans l'un des 2 cas il faut refuser le traitement.
    le mieux etant peut etre de rendre le bouton prioritaire ,
    avec une attente bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    // dans le bouton
    while(singleLock.IsLocked())
    {
        PumpMessages() ;
    }
    singleLock.Lock();
    // acces aux données 
    singleLock.Unlock();
    pour le pumpmessage voir faq:
    http://c.developpez.com/faq/vc/?page...rk#PumpMessage

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Ok ça marche merci beaucoup.

    Mais je voudrais bien savoir pourquoi j'avais cette situation de blocage...
    J'avais même essayé d'executer ma fonction de Timer dans un Thread et ça ne changeait rien.....

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    J'ai une autre question :
    Est ce qu'il est possible que mon timer reprenne la main entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(singleLock.IsLocked())
    {
        PumpMessages() ;
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    singleLock.Lock();

Discussions similaires

  1. Réponses: 13
    Dernier message: 20/03/2007, 17h04
  2. problème de synchronisation de thread
    Par youp_db dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 11/10/2006, 11h34
  3. [VB.net] Problème de synchronisation d'une base
    Par WriteLN dans le forum Windows Forms
    Réponses: 18
    Dernier message: 21/10/2005, 13h11
  4. [C#] Problème de synchronisation de combobox
    Par WwiloO dans le forum Windows Forms
    Réponses: 3
    Dernier message: 20/12/2004, 19h56
  5. Problème de synchronisation dans un JTextArea
    Par wutang dans le forum Composants
    Réponses: 3
    Dernier message: 21/06/2004, 15h06

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