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 :

Mon timer n'est pas prioritaire !!


Sujet :

MFC

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Mon timer n'est pas prioritaire !!
    Salut,

    J'ai lu les qq post qui parlaient de timer et j'ai donc mis en place un timer avec SetTimer(). Il me sert à envoyer à intervalle regulier un message à travers mon réseau local depuis mon appli cliente vers un serveur situé sur une autre machine et ce pour que le serveur sache en permanence que le client est toujours connecté.

    Le probleme s'est que mon timer est attaché à la fenetre principale de mon appli qui comporte une barre de menu. Le timer marche bien que je sois dans la fenetre principale ou dans une des fenetres filles. Mais si je reste dans un des menus de ma fenetre principale, le timer cesse de fonctionner (pas cool...)
    J'ai pu voir que le msg WM_TIMER était loin d'etre prioritaire et je suppose que tant que je n'ai pas fait mon choix dans le menu (genre Fichier>Ouvrir),, mon appli laisse mon WM_TIMER de coté et se focalise sur d'autres messages....

    Est-ce qu qq'un aurait une idée pour que le msg WM_TIMER devienne prioritaire et pour que mon appli puisse envoyer à son serveur les messages qu'il attend à intervalle régulier et ce quoique je fasse avec mon client ?

    Merci !

  2. #2
    mat.M
    Invité(e)
    Par défaut
    Il me sert à envoyer à intervalle regulier un message à travers mon réseau local depuis mon appli cliente vers un serveur situé sur une autre machine et ce pour que le serveur sache en permanence que le client est toujours connecté.
    Comme je le dirais tjs les TImers ne sont pas "fiables" parce que comme tu l'écris , à intervalles réguliers , il y a telle ou telle action qui est déclenchée.
    Problème : à un instant t0 on déclenche une action A qui dure un certain temps.
    A un instant t1 qui est le delta de temps avec t0 , qu'est-ce qui se passe si le traitement n'est pas terminé , ici en l'occurence une communication avec le réseau ?
    L'événement OnTimer à l'instant t1 relance l'action A....qui ne s'est pas terminé.

    Et qu'est-ce qui se passe s'il ya des latences conséquentes sur le réseau ? ( c.a.d. on "ping" mal )

    Donc vraisemblablement la solution peut passer par une programmation multiprocessus ou multithreading ....
    Sinon utiliser des EVENT ( CEvent avec MFC ) , sections critiques etc..

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    En fait dans le principe, si mon serveur ne reçoit pas de "message" de la part du client au bout d'une minute (le client envoyant un message toutes les 20s), il reinitialise la connection, donc pour les latences du réseau ca devrait suffire.
    Mon souci était vraiment de comprendre pourquoi lorsque je rentrais dans un menu de mon IHM, ma fonction ::OnTimer n'étais plus appelée....

    En tout cas merci pour tes indications mat. Je pars donc à la decouverte des EVENT puis du multithreading si necessaire....

  4. #4
    Membre éprouvé
    Avatar de Gabrielly
    Inscrit en
    Juin 2004
    Messages
    722
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 722
    Points : 1 128
    Points
    1 128
    Par défaut
    Les messages WM_TIMER quand elles arrivent à intervalle de temps réguliers, ils ne s'empilent pas dans la pompe à message. Si le delais est arrivé et que le message WM_TIMER n'a pas pu être traiter il est tout simplement détruit. et dans ce cas l'intervalle double.

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je suis d'accord. Mais si je reste une heure avec mon menu ouvert, aucun WM_TIMER ne sera traité.
    Dès que j'aurais fait un choix a travers mon menu ou refermé ce dernier, les WM_TIMER recommenceront à être traité comme si de rien n'était.

    Donc si quelqu'un à une idée de ce qui cause ce désagremment.....

  6. #6
    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
    Si tu utilises le multithreading ya pas moyen d'arranger tout ça ?

  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
    salut,
    regarde ce post sur codeguru qui implement un timer dans un thread separé
    ça devrait resoudre ton pb :
    http://www.codeguru.com/Cpp/W-P/system/timers/article.php/c5753/

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je venais justement de tomber dessus !!

    Merci à tous, je vous tiens au courant...(mais pas ce soir...)

  9. #9
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    essaie avec un timer sans passer par WM_TIMER mais le pointeur de fonction. Il fonctionne beaucoup mieux, dans le sens plus fiable

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Merci à tous pour vos indications, j'ai trouvé une classe sur codeguru qui a résolu mon probleme ( un peu plus simple que celui indiqué par farscape):

    http://www.codeguru.com/Cpp/misc/misc/timers/article.php/c341/


    ++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [ADO.NET]Apparament mon delete n'est pas mis à jour.Quoi que?
    Par lrx94 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/12/2006, 15h33
  2. Réponses: 4
    Dernier message: 28/09/2006, 14h50
  3. [C# 2.0] Pourquoi mon DataAdapter n'est pas instancié ?
    Par FraktaL dans le forum Services Web
    Réponses: 2
    Dernier message: 04/07/2006, 00h04
  4. Mon code n'est pas interprété !
    Par korriganez dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2006, 15h46
  5. Mon clonage n'est pas correct ?
    Par elitost dans le forum Langage
    Réponses: 6
    Dernier message: 21/03/2006, 14h38

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