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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  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 397
    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 397
    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 397
    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 397
    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.

+ 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