2009-12-11 7 views
3

Y a-t-il une différence de performances lorsque le multi-thread est développé avec des objets d'événement win32 (CreateEvent) ou avec une file d'attente de messages de la fenêtre de threads. Les deux devraient utiliser une sorte d'appel WaitFor .... Mon propre code presque entièrement basé sur l'événement, mais peut-être que je perds quelque chose quand n'utilisez pas les messages.multithreading: piloté par les événements vs piloté par les messages

Répondre

4

Si vous êtes préoccupé par la différence de performances entre les messages de thread et les événements du noyau, vous ne devriez probablement pas utiliser les messages de threads.

Les files d'attente de messages Win32 sont un mécanisme développé à l'origine pour Windows 16 - lorsqu'il n'y avait pas de threads. Ils ont grandi pour gérer le modèle de filetage de Win32, mais sous les couvertures, ce sont des bêtes plutôt complexes.

Cela a des avantages et des inconvénients. Les inconvénients sont, tout simplement, qu'ils sont plus lents, et ont beaucoup plus de limites, que d'autres formes de synchronisation inter-thread et de communication. Pour commencer, parce que beaucoup de morceaux de code Windows (MessageBox, DoDragDrop etc) implémentent des boucles de messages modales - il y a beaucoup de fois où les messages de threads peuvent être perdus. Il est important de ne pas utiliser ces API à partir de threads destinés à recevoir des messages de threads. ** 1 * Il existe également des limites à la taille d'une file d'attente avant qu'elle ne lâche des messages et les API de messagerie de threads (GetMessage) provoque l'entrée du thread dans un état d'alerte (vous ne pouvez donc pas utiliser QueueUserAPC).

Les messages pro 'for thread sont - tant que leurs limites sont respectées - ils sont une roue pré-faite très fiable qui sérialise les appels à un thread. Si vous vous trouvez à implémenter un mécanisme de mise en file d'attente pour un thread de travail non UI, pourquoi réinventer une roue bien testée - utilisez la file d'attente de messages préconstruite.

** 1 * Ceci inclut la plupart des implémentations de macro de débogage comme ASSERT qui feront apparaître une boîte de message.

Questions connexes