8
votes

Multiples threads Souscrit le même événement

Que se passera-t-il lorsque 10 threads s'abonneront au même événement et aux incendies de l'événement? Quel fil le ramassera?


3 commentaires

Qu'est-ce que tu veux dire des fils? Comment le thread peut-il s'abonner à l'événement? Je pense que tu voulais dire quelque chose de différent ...


10 threads exécutant la même méthode qui souscrit à un événement.


Cette question est un peu déroutante ou peut ne pas être comprise correctement. Si l'événement est un événement Windows (c'est-à-dire créé par CreateEeEvent) et plusieurs threads attendent qu'il soit signalé, la réponse de Scotttx semble être correcte. Si l'événement est l'événement de l'application de candidature (semblable à Delphi ou C # onclick événement d'un bouton), de nombreuses réponses peuvent être correctes! (Mais encore une fois, comment plusieurs threads peuvent abonner à un événement d'application? !!). Ce message est censé donner aux lecteurs une tête, même si c'est une question ancienne.


6 Réponses :


16
votes

Le fil ne vous abonnez pas aux événements, les objets font. Lorsqu'un événement déclenche, tous les gestionnaires enregistrés exécutent sur le même thread (celui qui a soulevé l'événement). Il n'y a pas d'installation intégrée pour les événements pour tirer sur plusieurs threads.

Un gestionnaire peut choisir d'envoyer les informations d'événement à un fil séparé, si vous le souhaitez, mais cela ne fait pas partie du mécanisme intégré de l'expédition des événements.



1
votes

Je pense que ce que vous voulez dire ici, c'est que plusieurs objets sur des threads distincts s'abonnent à un événement.

Tous les gestionnaires seront appelés mais sur le même fil qui a invoqué l'événement.


0 commentaires

0
votes

La réponse à votre question Je suppose que cela dépend de la mise en œuvre du répartiteur de l'événement ... Habituellement, vous utilisez une liste pour garder une trace de tous les gestionnaires d'événements qui sont souscrits à un événement particulier, le plus probablement en termes de ceci. Type de mise en œuvre, le premier gestionnaire qui est tiré est le premier gestionnaire d'événements qui s'est abonné si vous appelez bien sûr toutes les procédures pertinentes de manière synchrone, sinon cela dépend ... Juste une pensée ..


0 commentaires

0
votes

Si vous voulez savoir quel objet prendra l'événement, chaque objet qui souscrit à un événement prendra en charge cet événement, mais chacun sera exécuté sur le fil sur lequel l'événement s'est produit.

Si vous voulez savoir quel objet ramassera cet événement d'abord voir la réponse aux ultrajohnons.


0 commentaires

0
votes

Je pense que si je comprends votre question. Vous voulez demander à votre objet expose un événement que l'utilisateur de votre objet peut souscrire. Si 10 utilisateurs différents de votre objet se sont souscrits à cet événement et que, à un moment donné, vous tirez l'événement, quel serait l'ordre (ou simultanément) les gestionnaires d'événements seraient invoqués?

Réponse : Étant donné que l'exécution du gestionnaire d'événements se produit sur le même thread qui l'incendie (dans ce cas, le thread de traitement de votre objet) ne peut traiter qu'une fonction de gestionnaire à la fois. La commande n'est pas garantie (ce qui signifie pas nécessairement le premier abonné exécuté en premier et dernier serait exécuté en dernier). J'espère que cela répond à votre question. La ligne inférieure est que tout le gestionnaire serait appelé et aucun ne serait en parallèle. Ils seront exécutés l'un après l'autre. J'ai vu des gens par accident accidentellement pour économiser deux fois l'événement, puis voir l'action se produire deux fois et avoir du mal à déterminer pourquoi certaines choses se passent plusieurs fois.


0 commentaires

3
votes

Si par "événement", vous voulez dire un événement de synchronisation Win32 (ce qui est de savoir comment je lis la question), cela dépend de la création de la création de l'événement. Si sa réinitialisation manuelle, l'événement signalera toutes les threads et tous s'exécuteront. Si sa réinitialisation automatique, un seul thread sera signalé et exécuté. L'un de vos 10 threads en attente de l'événement pourrait être choisi.


0 commentaires