Question

Pourquoi la déclaration PeekMessage est nécessaire avant getMessage () pour la création de file d'attente de messages?

Était-ce utile?

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:

  1. 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 de PM_REMOVE pour interroger la file d'attente de messages et laisser de GetMessage tout à fait.
  2. 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.
  3. Appel IsWindowUnicode sur la poignée de la fenêtre de messages renvoyés et en sélectionnant PeekMessageA ou PeekMessageW.
  4. multiple de ce qui précède.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top