Accueil
Rechercher:
sur developpez.com sur les forums
Forums | Tutoriels | F.A.Q's | Participez | Hébergement | Contacts
Club Emploi Blogs   TV   Dév. Web PHP XML Python Autres 2D-3D-Jeux Sécurité Windows Linux PC Mac
Accueil Conception Java DotNET Visual Basic  C  C++ Delphi MS-Office SQL & SGBD Oracle  4D  Business Intelligence
FORUMS C FAQs C TUTORIELS C LIVRES C COMPILATEURS C SOURCES GTK+

Tutorial d'initiation
A la programmation avec l'API Windows

Tutorial d'initiation a la programmation Windows avec Microsoft Visual C++
PrécédentIndexSuivant

Chapitre 3

Les fenêtres

3. Récupération des messages

Cours théorique :

La réception des messages et leur transmission à la procédure de fenêtre appropriée sont essentiels. L'application ne doit jamais cesser 'd'écouter' au cas où de nouveaux messages arriveraient. Si l'application arrête de transmettre les messages, la fenêtre semblera 'bloquée' (affichage persistant, impossibilité de la déplacer...).

La récupération des messages peut se faire grâce à deux fonctions : GetMessage() ou PeekMessage(). La différence entre ces deux fonctions est fondamentale, il ne faut donc pas les assimiler.

GetMessage() est une fonction bloquante. Elle attend qu'au moins un message soit présent dans la file d'attente de la fenêtre pour retourner. Le temps d'attente est infini, tant qu'aucun message n'est placé dans la file d'attente.

PeekMessage() est une fonction non bloquante. Elle vérifie si des messages sont présents et retourne immédiatement. Si au moins un message était présent, elle le retourne, sinon elle ne retourne aucun message. De plus, cette fonction permet de ne pas supprimer les messages de la file d'attente. On peut donc consulter des messages et laisser la boucle de messages principale effectuer le traitement.

L'utilisation de ces deux fonctions s'inscrit dans des cadres totalement différents. En général, GetMessage() est utilisé dans une boucle 'while'. Si aucun message n'est présent, GetMessage() signale au système qu'il peut donner le processeur à une autre application. Placer cette fonction dans une boucle ne génère donc pas d'occupation processeur tant qu'aucun message n'est présent dans la file d'attente. PeekMessage() ne fonctionne pas de cette manière. Placer cette fonction dans une boucle 'while' génère une occupation processeur de 100%. La fonction sera effectivement appelée un nombre indéfini de fois, occupant ainsi le processeur. La récupération principale des messages doit donc se faire avec la fonction GetMessage().

Cependant, si l'application est occupée, elle peut appeler de manière régulière PeekMessage() suffisamment de fois pour traiter tous les messages. Par exemple, toute les secondes, PeekMessage() est appelée jusqu'à épuisement de la file d'attente. Le traitement des messages sera plus lent mais il sera effectué quand même. Cette solution évite de devoir faire appel au multi-threading (exécution simultanée de plusieurs parties du programme).

La différence entre ces deux fonctions doit donc être clairement comprise. L'utilisation de l'une ou l'autre de ces fonctions à tort peut s'avérer catastrophique pour les performances du programme et du système dans son ensemble. Dans le cas d'une application n'effectuant pas de tâches lourdes, l'utilisation de PeekMessage() ne sera pas nécessaire. L'interruption du traitement des messages pour une durée courte (jusqu'à un dixième de secondes) est sans conséquences. Il faut tout de même remarquer que GetMessage() ne sera pas rappelée tant que le traitement du message courant n'est pas terminé. Le traitement des messages par la procédure doit donc si possible être bref.

Voici un exemple classique de boucle réalisant le traitement de messages :

MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

La fonction GetMessage() retourne FALSE si le message WM_QUIT est reçu. Ce message est envoyé à la fenêtre principale pour demander l'arrêt de l'application. Par défaut, ce message n'est pas envoyé lors de la destruction de la fenêtre.


PrécédentIndexSuivant

Responsable bénévole de la rubrique C : Arnaud Feltz (buchs) - Contacter par EMail :
Vos questions techniques : forum d'entraide C - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright © 2000-2008 www.developpez.com - Legal informations.