Pourquoi l'instruction peekMessage est requise avant Getmessage() pour créer une file d'attente de messages?Pourquoi peekmessage avant d'obtenir un message?
Répondre
Ce n'est pas obligatoire. Ce que vous verrez parfois, cependant, est un thread qui n'est pas encore prêt à traiter les messages, mais il veut pouvoir les recevoir dans sa file d'attente de messages. Les nouveaux threads n'ont pas de files d'attente de messages immédiatement, mais l'appel PeekMessage
est suffisant pour créer la file d'attente de messages. Il retourne immédiatement puisqu'il n'y a pas de message, et cela permet au thread de continuer à se préparer. En attendant, d'autres threads peuvent commencer à mettre en file d'attente des messages pour le nouveau thread. Une fois que le nouveau thread est prêt, il appelle GetMessage
soit pour récupérer le premier message de la file d'attente, soit pour attendre qu'un message soit mis dans la file d'attente.
Ce n'est pas le cas. Les deux fonctions font des choses différentes. PeekMessage (...) n'attend pas l'apparition d'un message - il obtient le premier s'il est présent, en le supprimant éventuellement de la file d'attente, mais renvoie faux dès qu'il n'y en a pas. Il est plus courant dans les applications où vous effectuez un traitement en attendant les messages, et vous ne pouvez pas vous asseoir là et attendre indéfiniment le message suivant. Les jeux en temps réel et tels tombent facilement dans cette catégorie. GetMessage (...) attend qu'il y ait un message, et l'obtienne. Il est plus efficace CPUwise, parce que ce n'est pas en permanence interroger, mais il fera une pause s'il n'y a pas de messages. Il est plus commun dans les applications formy et d'autres programmes qui ne nécessitent pas de traitement en temps réel constant.
Voici une autre référence, qui note que ce n'est pas nécessairement la façon la plus sage de faire du travail en arrière-plan (il semble que Delphi a des threads): http://windows-programming.suite101.com/article.cfm/win32_message_processing_primer – HostileFork
Il y a plusieurs raisons d'utiliser PeekMessage
avant/au lieu de GetMessage
:
- Assurer le programme ne se bloque pas jusqu'à ce qu'un message arrive - c'est un peu redondant, parce que vous pouvez utiliser directement
PeekMessage
avec le drapeauPM_REMOVE
à interroger la file d'attente de messages et omettreGetMessage
tout à fait. - En utilisant la fonction avec
PM_NOREMOVE
et en décidant si vous souhaitez traiter et/ou supprimer le message de la file d'attente, ou non. - Appelez
IsWindowUnicode
sur le handle de fenêtre des messages renvoyés et en sélectionnantPeekMessageA
ouPeekMessageW
. - Multiple de ce qui précède.
Merci, ça répond à ma question. – Josh