2009-11-25 17 views
0

Est-il possible de prioriser un message envoyé avec PostMessage (ou l'une des autres méthodes associées)?PostMessage avec priorité?

IIRC, le message WM_PAINT, par exemple, n'est traité que lorsqu'il n'y a pas d'autres messages dans la file d'attente. Est-il possible d'obtenir un comportement similaire avec des messages personnalisés?

Si j'utilise WM_PAINT avec des paramètres spéciaux afin de délivrer un message personnalisé à une fenêtre (dont je commande le WndProc) aura-t-il un comportement similaire?

Répondre

1

Pour WM_PAINT le code de fenêtrage en DefWndProc définit juste un drapeau, puis vérifie que le drapeau uniquement si la file d'attente est vide, la prochaine fois que GetMessage est appelé. Certains messages de la souris sont également coalisés (les plus anciens sont supprimés lorsque les plus récents arrivent). La vraie réponse dépend du comportement que vous voulez vraiment atteindre.

Si vous essayez d'éviter réentrée il suffit de cocher un drapeau pour une sortie rapide , quelque chose comme:

////bool processing = false; // class/window instance variable 
... 
void HandleCustomMessage() 
{ 
    ////if (processing) 
    ////{ 
    //// return; 
    ////} 

    ////processing = true; 
    DoSomething(); 
    ////processing = false; 
} 

Si vous voulez une file d'attente de priorité réelle, il existe de nombreuses implémentations PQ. Ajoutez l'élément de données au PQ, puis publiez un message personnalisé (toujours le même ID). Le gestionnaire de message personnalisé demande ensuite au PQ l'élément le plus prioritaire.


Une autre option est d'intercepter la boucle GetMessage, utilisez un appel à PeekMessage pour voir s'il y a quelque chose à faire, puis appelez GetMessage si un message est disponible, ou consultez votre PQ autrement. Vous n'avez pas besoin d'un message personnalisé avec cette approche.

+0

Je ne sais pas, je comprends l'approche du drapeau. Les files d'attente de l'interface utilisateur sont à un seul thread, de sorte que vous n'obtiendrez jamais la condition (ou si vous évitez d'être réentrant dans plusieurs files d'attente, je ne vois pas en quoi cela est important pour la hiérarchisation). L'utilisation d'un message personnalisé + un PQ séparé est une bonne idée, bien que la priorisation ne fonctionne pas avec d'autres messages "non personnalisés". Je me demandais s'il y avait un mécanisme interne pour cela? – sold

+0

Oups, à moitié endormi et oublié le fil de l'interface utilisateur unique - étonnant à quelle vitesse vous oubliez quand vous n'avez pas affaire à ce genre de choses tous les jours. – devstuff

2

Je voulais un thread d'arrière-plan pour informer le principal que les résultats sont disponibles à l'utilisateur. Mais si vous envoyez simplement un message au thread principal, il sera traité immédiatement. Cela a conduit l'application à ne pas répondre aux messages de peinture ou d'entrée de l'utilisateur, parce que mon message posté a toujours eu la priorité.

L'astuce que j'ai utilisée était la connaissance que WM_TIMER messages ont une priorité inférieure à WM_PAINT messages.

Donc plutôt que de poster un message sur le formulaire principal, je définirais un minuteur.

messages de minuterie ont une priorité inférieure à

  • autre message posté
  • messages WM_PAINT