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

Visual C++ Discussion :

[Thread] Boucle à message


Sujet :

Visual C++

  1. #1
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut [Thread] Boucle à message
    Bonjour,

    Dans un thread destiné au traitement de messages (boucle à messages) envoyés par d'autres threads, j'aurais voulu savoir si lorsque le je suis entrain de traiter un message dans ma boucle et si pendant ce temps je recois un autre message à traiter, est ce que ce dernier est mis automatiquement et implicitement dans une file de message associé au thread de traitement de messages ou est il nécessaire de créer sa propre pile/queue de messages pour stocker tout les messages à traiter.

    Voici en gros à quoi ressemble le thread de traitement de messages:
    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
     
    while(!g_endListenThreadServer)
    {
    	MSG msg; 
    	if(GetMessage(&msg, NULL, (WM_SERVEUR_SOCKET_ERROR-1), (WM_SERVEUR_E+1)))
    	{ 
    		// Type de message
    		if(msg.message == WM_SERVEUR_SOCKET_ERROR)
    		{
    			// Fermeture du serveur
    			g_endListenThreadServer = true;
     
    		}
    		else if(msg.message == WM_SERVEUR_A)
    		{
    			Fonction1();
    		}
    		else if(msg.message == WM_SERVEUR_B)
    		{
    			Fonction2();
    		}
    		else if(msg.message == WM_SERVEUR_C)
    		{
    			Fonction3();
    		}
    		else if(msg.message == WM_SERVEUR_D)
    		{
    			Fonction4();
    		}
    		else if(msg.message == WM_SERVEUR_E)
    		{
    			Fonction5();
    		}
    	}
    }
    Merci
    Nicolas

  2. #2
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Bonjour,

    Peut être n'ais je pas été assez clair... Si des points semblent obscurs concernant mon post, faîtes le moi savoir.

    Le code dans mon premier post est à l'intérieur d'un thread créé via la fonction CreateThread().

    Ce que je me demande en gros, c'est si ce thread possède une queue de messages par défaut?

    En effet, j'ai l'impression que non, car lorsque je suis entrain de traiter un message dans ma boucle GetMessage(), j'ai déduit que tout messages envoyés durant ce laps de temps sont perdus...

    Si c'est bien cela, quel est le meilleur moyen de créer une file à message pour stocker des messages postés via PostThreadMessage et de les traiter un par un dans ma boucle à message?

    Nicolas

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Par défaut
    je sais pas si ça va t aider mais en win32 les messages sont reçus dans la fonction principale (winmain) puis envoyés où il faut, bien sur avec une file d attente.

    Pour la gestion de message utilise un switch case c est beaucoup plus clair.



    Peux tu donner le contexte de ton 'projet' pour pouvoir mieux t aider

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Ashin: Ça n'aide rien du tout.

    homeostasie: Chaque thread possède une file de messages dès qu'une fonction relative aux messages est appelée dans le thread.
    Par exemple, si ton thread est long à initialiser, tu peux mettre dès le début un appel à PeekMessage() avec le flag PM_NOREMOVE pour créer la file de messages dès le début du thread (mais on en a rarement besoin).

    Donc, si un nouveau message est posté au thread (ou posté ou envoyé à une de ses fenêtres) pendant que tu en traites un, il sera mis en file d'attente comme les autres.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par Médinoc
    homeostasie: Chaque thread possède une file de messages dès qu'une fonction relative aux messages est appelée dans le thread.
    Par exemple, si ton thread est long à initialiser, tu peux mettre dès le début un appel à PeekMessage() avec le flag PM_NOREMOVE pour créer la file de messages dès le début du thread (mais on en a rarement besoin).

    Donc, si un nouveau message est posté au thread (ou posté ou envoyé à une de ses fenêtres) pendant que tu en traites un, il sera mis en file d'attente comme les autres.
    Merci pour cette réponse. C'est exactement cela que je voulais savoir. J'étais entrain de me demander s'il était nécessaire d'utiliser un mécanisme de protection/avertissement(mutex ou événement) pour spécifier si le thread de gestion de messages peut recevoir ou non un message selon si un autre est en cours de traitement.

    Par contre, d'après mes recherches rapides, on peut seulement posté un message vers un thread de "travail". En effet, il existe la fonction PostThreadMessage() pour poster un message mais une éventuelle fonction telle que SendThreadMessage ne semble pas existé.


  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    En effet, SendMessage() ne marche que sur les fenêtres, car il faut un moyen de donner la réponse.

    Mais tu peux toujours créer une fenêtre invisible rien que pour cela. Les versions 2000 et supérieures de NT supportent même les "message-only windows", des fenêtres "lightweight" et invisibles pour faire des traitements quand on reçoit un message...

    Mais si tu peux l'éviter, évite-le, car dès qu'il a une fenêtre, visible ou non, un thread doit répondre rapidement aux messages:
    http://blogs.msdn.com/oldnewthing/ar...10/529525.aspx

    De plus, pendant que ton thread de travail bosse, si ton thread principal l'attend, alors il est bloqué et il ne répond plus non plus. Utiliser des PostMessage() et PostThreadMessage() dans les deux sens permet de rester asynchrone.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Merci pour les précisions.

    En effet, j'avais pensé à faire une fenêtre invisible mais après réflexion, cela me semblait un peu lourd...Maintenant je serais que si un jour j'en ai besoin, j'utiliserais l'option message-only windows.

    Je vais lire ce petit article!

    Bonne soirée.

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

Discussions similaires

  1. Closer un thread de message d'attente proprement
    Par Vonziz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/04/2009, 16h52
  2. Boucle message dans un thread
    Par jhonnyBravo dans le forum Threads & Processus
    Réponses: 3
    Dernier message: 27/07/2007, 11h22
  3. Thread et messages
    Par yonderboy dans le forum Delphi
    Réponses: 3
    Dernier message: 17/01/2007, 17h33
  4. [Thread]Boucle infinie sans 99% du proc
    Par dinver dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/12/2005, 17h15
  5. Thread et message
    Par sioux dans le forum Langage
    Réponses: 28
    Dernier message: 01/06/2005, 00h33

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