Modele d`appartement

Chaque thread dans un processus qui est initialisé en tant que processus de modèle d`appartement, et qui récupère et distribue des messages de fenêtre, est un thread d`appartement à thread unique. Chaque thread vit dans son propre appartement. Dans un appartement, les pointeurs d`interface peuvent être passés sans marshaling, et par conséquent, tous les objets d`un thread cloisonné simple communiquent directement. Le problème le plus important dans la programmation avec un modèle multithread est de rendre votre code thread-safe afin que les messages destinés à un thread particulier aller uniquement à ce thread et l`accès aux threads est protégée. Les modèles de filetage dans COM fournissent le mécanisme pour les clients et les serveurs qui utilisent différentes architectures de filetage pour travailler ensemble. Les appels entre des objets avec différents modèles de filetage dans différents processus sont naturellement pris en charge. Du point de vue de l`objet appelant, tous les appels à des objets en dehors d`un processus se comportent de manière identique, peu importe la façon dont l`objet appelé est fileté. De même, du point de vue de l`objet appelé, les appels arrivant se comportent de façon identique, quel que soit le modèle de thread de l`appelant. L`utilisation d`appartements à thread unique (le processus de modèle d`appartement) offre un paradigme basé sur les messages pour traiter plusieurs objets exécutés simultanément.

Il vous permet d`écrire un code plus efficace en autorisant un thread, tandis qu`il attend une opération fastidieuse à terminer, pour permettre l`exécution d`un autre thread. Alors que plusieurs objets peuvent vivre sur un seul thread, aucun objet de modèle d`appartement ne peut vivre sur plus d`un thread. Les modèles interprocessus et threads sont similaires. Lorsqu`il est nécessaire de passer un pointeur d`interface à un objet dans un autre appartement (sur un autre thread) au sein du même processus, vous utilisez le même modèle de marshaling que les objets dans différents processus utilisent pour passer des pointeurs entre les limites de processus. En obtenant un pointeur vers l`objet marshaling standard, vous pouvez marshaler des pointeurs d`interface entre les limites de thread (entre les appartements) de la même manière que vous le faites entre les processus. (Les pointeurs d`interface doivent être marshalés lorsqu`ils sont passés entre les appartements.) Si un appartement (Appartement 1) dans un processus a un pointeur d`interface et un autre appartement (appartement 2) nécessite son utilisation, Appartement 1 doit appeler CoMarshalInterThreadInterfaceInStream pour marshaler l`interface. Le flux qui est créé par cette fonction est thread-safe et doit être stocké dans une variable qui est accessible par l`appartement 2. L`appartement 2 doit passer ce flux à CoGetInterfaceAndReleaseStream pour démarshaler l`interface et récupérer un pointeur vers un proxy via lequel il peut accéder à l`interface.