Pouvez-vous expliquer STA et MTA dans vos propres mots ?
Aussi, quels sont les fils de l’appartement et qu’ils se rapportent qu’à la COM ? Dans l’affirmative, pourquoi ?
Pouvez-vous expliquer STA et MTA dans vos propres mots ?
Aussi, quels sont les fils de l’appartement et qu’ils se rapportent qu’à la COM ? Dans l’affirmative, pourquoi ?
COM le modèle de thread est appelé un "appartement" de modèle, où le contexte d'exécution de initialisé objets COM est associé à un seul thread (Thread Unique Appartement) ou le nombre de threads (Multi Thread Appartement). Dans ce modèle, un objet COM, une fois initialisé dans un appartement, fait partie de l'appartement pour la durée de son exécution.
Le modèle STA est utilisé pour des objets COM qui ne sont pas thread-safe. Cela signifie qu'ils ne gèrent pas leur propre synchronisation. Une utilisation commune de ce qui est un composant de l'INTERFACE utilisateur. Donc, si un autre thread a besoin d'interagir avec l'objet (par exemple en appuyant sur un bouton dans un formulaire), alors le message est rassemblée sur le thread STA. Les windows forms message d'un système de pompage en est un exemple.
Si l'objet COM peut gérer son propre synchronisation puis le modèle MTA peuvent être utilisés lorsque plusieurs threads sont autorisés à interagir avec l'objet sans mobilisé les appels.
Tout est à la façon dont les appels vers les objets sont manipulés, et la protection dont ils ont besoin. COM objets peuvent demander l'exécution afin de les protéger contre d'être appelé par plusieurs threads en même temps; ceux qui n'en ont pas peuvent potentiellement être appelé en même temps à partir de threads différents, de sorte qu'ils ont à protéger ses propres données.
En outre, il est également nécessaire pour l'exécution d'empêcher un objet COM appel de blocage de l'interface utilisateur, si un appel est effectué à partir d'un thread d'interface utilisateur.
Un appartement est un lieu pour les objets de vivre, et ils contiennent un ou plusieurs threads. L'appartement définit ce qui arrive quand les appels sont effectués. Les appels aux objets dans un appartement seront reçues et traitées sur n'importe quel thread dans cet appartement, à l'exception d'un appel par un fil déjà dans le droit de l'appartement est traité par lui-même (c'est à dire un appel direct à l'objet).
Les fils peuvent être soit dans un single-threaded apartment (dans ce cas, ils sont le seul fil dans l'appartement) ou dans un environnement multi-threaded apartment. Elles indiquent quand le fil initialise COM pour ce thread.
Le personnel est principalement à des fins de compatibilité avec l'interface utilisateur, qui est reliée à un fil. Un STA reçoit des notifications d'appels à traiter par la réception d'un message de fenêtre pour une fenêtre masquée; lorsqu'il effectue un appel sortant, il commence un message modal de la boucle pour éviter que d'autres messages de fenêtre en cours de traitement. Vous pouvez spécifier un filtre de message d'être appelé, de sorte que votre application peut répondre à d'autres messages.
En revanche tous les MTA les threads partagent un seul MTA pour le processus. COM vous pouvez démarrer un nouveau thread pour gérer un appel entrant si aucun thread n'est disponible, jusqu'à une limite du pool. Les Threads de faire des appels sortants simplement le bloquer.
Pour des raisons de simplicité, nous considérons que seuls les objets mis en œuvre dans les Dll, qui annonce dans le registre de ce qu'ils soutiennent, par la définition de la ThreadingModel
de la valeur de leur classe de la clé. Il y a quatre options:
ThreadingModel
de la valeur n'est pas présent). L'objet est créé sur l'ordinateur hôte principal du thread d'INTERFACE utilisateur, et tous les appels sont ralliés à ce thread. La fabrique de classe ne sera appelée sur ce thread.Apartment
. Cela indique que la classe peut s'exécuter sur n'importe quel mono-thread thread en mode. Si le fil qui le crée est un thread STA, l'objet sera exécuté sur ce thread, sinon il sera créé dans les principaux STA - si la principale STA existe, un thread STA sera créé pour elle. (Cela signifie MTA fils qui créent Appartement objets seront gares de tous les appels vers un autre thread.) La fabrique de classe peuvent être appelés simultanément par plusieurs threads STA donc il se doit de protéger ses données internes à cet égard.Free
. Cela indique une classe, conçu pour fonctionner dans les MTA. Il sera toujours à la charge de la MTA, même si elles sont créées par un thread STA, ce qui signifie que le thread STA appels seront rassemblés. C'est parce qu'un Free
objet est généralement écrit avec l'espoir qu'il peut bloquer.Both
. Ces classes sont flexibles et de la charge, quelle que soit l'appartement qu'ils sont créés à partir. Elles doivent être écrites pour les deux ensembles de besoins, cependant: ils doivent protéger leur état interne contre les appels simultanés, dans le cas où ils sont chargés dans le MTA, mais ne doit pas bloquer, dans le cas où ils sont chargés dans un STA.De la .NET Framework, fondamentalement, suffit d'utiliser [STAThread]
sur n'importe quel thread qui crée de l'INTERFACE utilisateur. Les threads de travail doit utiliser le MTA, sauf qu'ils vont utiliser Apartment
-marqué composants COM, dans quel cas utiliser la STA pour éviter de triage de la surcharge et de l'évolutivité des problèmes si le même composant est appelé à partir de plusieurs threads (comme chaque thread va avoir à attendre pour le composant à son tour). Il est beaucoup plus facile tout autour si vous utilisez un objet COM par thread, si le composant est dans le cfs ou le MTA.
Je trouve l'existant explications trop charabia. Voici mon explication en anglais:
STA: Si un thread crée un objet COM qui est mis à STA (lors de l'appel de CoCreateXXX vous pouvez passer un indicateur qui définit l'objet COM pour le mode STA), puis seulement ce thread peut accéder à cet objet (c'est ce que STA moyen - Mono-thread Appartement), d'autres thread tente d'appeler des méthodes sur cet objet COM est sous le capot tourné en silence dans la diffusion des messages du thread qui l'a crée(propriétaire) de l'objet COM. C'est très bien comme le fait que seul le thread qui a créé un contrôle d'INTERFACE utilisateur peut y accéder directement. Et ce mécanisme est destiné à empêcher compliqué de verrouillage/déverrouillage des opérations.
MTA: Si un thread crée un objet COM qui est configuré pour MTA, alors à peu près chaque thread peut directement appeler des méthodes sur elle.
C'est à peu près l'essentiel. Bien que, techniquement, il y a certains détails que je ne l'ai pas mentionné, comme dans le 'STA' alinéa, le créateur du thread doit être lui-même STA. Mais c'est à peu près tout ce que vous devez savoir pour comprendre STA/MTA/NA.
STA (Single Threaded Apartment) est fondamentalement le concept qu'un seul thread va interagir avec votre code à la fois. Les appels au sein de votre appartement sont recueillis via les messages windows (à l'aide d'un non-visible) de la fenêtre. Cela permet de passer des appels en file d'attente et d'attente pour les opérations pour terminer.
MTA (Multi-Threaded Apartment) est l'endroit où de nombreux threads peuvent tous fonctionner en même temps et le fardeau de la preuve est sur vous que le développeur de gérer le fil de sécurité.
Il y a beaucoup plus à apprendre sur les modèles de thread dans la COM, mais si vous avez de la difficulté à comprendre ce qu'ils sont, alors je dirais que la compréhension de ce que le STA est et comment il fonctionne serait le meilleur point de départ, car la plupart des objets COM sont de STA.
Appartement Fils, si un thread vit dans le même appartement que l'objet qu'il utilise, alors c'est un appartement de fil. Je pense que ce n'est qu'un COM concept, car c'est une façon de parler des objets et des threads ils interagissent avec...
Chaque EXE qui accueille de COM ou de contrôles OLE définit l'appartement de l'état. L'appartement de l'état est, par défaut, STA (et pour la plupart des programmes devraient être STA).
STA - Tous les contrôles OLE, par nécessité, doivent vivre dans un STA. STA signifie que votre COM-objet doit toujours être manipulés sur le thread de l'INTERFACE utilisateur et ne peuvent être transmis à d'autres threads (un peu comme tout élément de l'INTERFACE utilisateur dans MFC). Cependant, votre programme peut encore avoir de nombreux fils.
MTA - Vous pouvez manipuler l'objet COM sur n'importe quel thread dans votre programme.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.