2010-05-17 15 views

Répondre

20

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.

+0

Merci, ça répond à ma question. – Josh

14

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.

+1

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

1

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 peu redondant, parce que vous pouvez utiliser directement PeekMessage avec le drapeau PM_REMOVE à interroger la file d'attente de messages et omettre GetMessage tout à fait.
  2. 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.
  3. Appelez IsWindowUnicode sur le handle de fenêtre des messages renvoyés et en sélectionnant PeekMessageA ou PeekMessageW.
  4. Multiple de ce qui précède.