Pourquoi PeekMessage avant getMessage?
-
27-09-2019 - |
Question
Pourquoi la déclaration PeekMessage est nécessaire avant getMessage () pour la création de file d'attente de messages?
La solution
Il est pas nécessaire.
Ce que vous verrez parfois, cependant, est un fil qui ne sont pas prêts à traiter les messages encore, mais il veut être en mesure de les recevoir dans sa file d'attente de messages. De nouvelles discussions ne sont pas les files d'attente de messages tout de suite, mais appelant PeekMessage
est suffisante pour créer la file d'attente de messages. Il retourne immédiatement car il n'y a pas de message, et qui permet au fil de continuer d'obtenir lui-même prêt. Entre-temps, d'autres threads peuvent commencer à faire la queue des messages pour le nouveau fil. Une fois que le nouveau thread est prêt, il appelle GetMessage
pour récupérer soit le premier message de la file d'attente ou d'attendre un message à mettre sur la file d'attente.
Autres conseils
Il est pas. Les deux fonctions font des choses différentes.
PeekMessage (...) n'attend pas un message apparaître - il obtient le premier si elle est là, le cas échéant la suppression de la file aussi bien, mais retourne faux immédiatement il n'y a pas. Il est plus fréquent dans les applications où vous faites un peu de traitement en attendant des messages, et ne peut pas rester assis là et attendre pour toujours le message suivant. jeux en temps réel et ce facilement tomber dans cette catégorie.
GetMessage (...) attend jusqu'à il y a un message, et il l'obtient. Il est CPUwise plus efficace, parce que c'est pas constamment vote, mais il se met en pause s'il n'y a pas de messages. Il est plus fréquent dans les applications de Formy et d'autres programmes qui ne nécessitent pas de traitement en temps réel de constante d'être en cours.
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 redondant peu, parce que vous pouvez utiliser directement
PeekMessage
avec le drapeau dePM_REMOVE
pour interroger la file d'attente de messages et laisser deGetMessage
tout à fait. - Utilisation de la fonction avec
PM_NOREMOVE
et de décider si vous voulez traiter et / ou supprimer le message de la file d'attente, ou non. - Appel
IsWindowUnicode
sur la poignée de la fenêtre de messages renvoyés et en sélectionnantPeekMessageA
ouPeekMessageW
. - multiple de ce qui précède.