9
votes

Pourquoi chutmessage avant GetMessage?

Pourquoi l'instruction PEEKMESSAGE est requise avant GetMessage () pour la création de la file d'attente de message?


0 commentaires

3 Réponses :


21
votes

Ce n'est pas nécessaire.

Ce que vous verrez parfois, cependant, est un fil qui n'est pas encore prêt à traiter des messages, mais il veut pouvoir les recevoir dans sa file d'attente de message. Les nouveaux threads ne disposent pas de files d'attente de messages tout de suite, mais appelant PeekMessage suffit pour créer la file d'attente de message. Il revient immédiatement car il n'y a pas de message et permet au fil de continuer à se préparer. Entre-temps, d'autres threads peuvent commencer à faire la queue de messages pour le nouveau fil. Une fois que le nouveau thread est prêt, il appelle getMessage pour extraire le premier message de la file d'attente ou pour attendre qu'un message soit mis sur la file d'attente.


0 commentaires

16
votes

Ce n'est pas. Les deux fonctions font des choses différentes.

PeekMessage (...) n'attend pas qu'un message apparaisse - il obtient le premier si c'est là, en le retirant éventuellement de la retirer de la file d'attente, mais retourne faux immédiatement il n'y en a pas. Il est plus courant dans les applications où vous faites un certain traitement en attendant des messages et que vous ne pouvez pas simplement rester là et attendre pour toujours pour le prochain message. Les jeux en temps réel et sont aussi facilement tomber dans cette catégorie.

getMessage (...) attend jusqu'à ce qu'il y a un message et l'obtient. C'est plus efficace de CPUWise, car il ne sondre pas constamment, mais cela pause s'il n'y a pas de messages. Il est plus courant dans les applications de formay et d'autres programmes qui ne nécessitent pas de traitement en temps réel constant.


1 commentaires

Voici une autre référence, qui note que ce n'est pas nécessairement le moyen le plus sage de faire des travaux de fond (il semble que Delphi a des threads): Windows-Programmer.suite101.com/article.cfm/...



1
votes

Il existe de multiples raisons pour utiliser PeekMessage avant / au lieu de getMessage :

  1. S'assurer que le programme ne s'accrochera pas tant qu'un message n'arrive pas - c'est un peu redondant, car vous pouvez utiliser directement peeekmessage avec le drapeau pm_remove pour interroger la file d'attente et partir out getMessage tout à fait.
  2. Utilisation de la fonction avec pm_noremove et décider si vous souhaitez traiter et / ou supprimer le message de la file d'attente ou non.
  3. appelant iswindowunicode sur la poignée de la fenêtre renvoyée des messages et sélectionnez Peekmessagea ou PEEKMESSAGEW .
  4. multiple de ce qui précède.

0 commentaires