2010-02-22 4 views
3

J'essaie de créer un composant COM, où il sera appelé fréquemment par une application Excel (excel chargera le COM lors de son initialisation) et un autre processus (disons procA) envoie également (avec haute fréquence) des messages Windows à ce composant. Actuellement, j'ai implémenté COM en tant que STA, cependant, j'ai expérimenté que COM est occupé à traiter les messages de procA, l'interface utilisateur d'Excel se coince.Quel modèle utiliser STA/MTA

S'il vous plaît, aidez-moi à contourner ce problème. Puis-je simplement créer un thread de fenêtre simple pour traiter les messages de procA tout en gardant COM comme modèle STA? Ou dois-je faire COM en tant que modèle MTA, si oui, veuillez expliquer comment le gérer.

Merci Vous

Répondre

1

Déplacement à un MTA vous oblige à effectuer tous les verrouillages nécessaires pour protéger l'état de votre composant. Et il ajoutera le surdébit du commutateur de threads car l'interface utilisateur d'Excel s'exécute sur un thread spécifique, ce qui bloquera tout en appelant le thread croisé dans votre composant. L'autre processus entraîne déjà les coûts indirects, donc pas de réel changement.

Vous pouvez éviter le surdébit Excel en marquant votre modèle de composant en tant que modèle de filetage 'Neutre' — il peut toujours être utilisé à partir de n'importe quel thread sans être lié à exister dans le MTA (c.-à-d. direct, pas de swicthes de fil). Ecrivez-le en tant que thread libre (tout le verrouillage est encore nécessaire), mais changez simplement l'enregistrement.

Compte tenu de tous les efforts pour assurer la sécurité de votre composant, vous pouvez trouver qu'il n'y a aucun avantage à moins que plusieurs appels dans votre composant puissent réellement s'exécuter simultanément. Si vous prenez juste un verrou pour la durée de chaque méthode, vous n'économisez rien sur un STA. Un verrouillage à granularité plus fine peut donner un avantage, mais vous avez besoin d'une analyse plus détaillée de la concurrence possible, puis d'un profilage pour prouver que vous avez réussi à l'atteindre. Un regard sur Amdahl's Law couvrira ces problèmes.


Ceci est mis très ... la situation simpliste réelle est plus complexe.

+0

Merci pour votre explication, Si je me trompe, vous me dites que je dois utiliser MTA pour répondre à mes exigences et le modèle neuronal serait un meilleur choix. Corrigez-moi si j'ai tort, s'il-vous plait. Je ne suis pas familier avec la création de threads à l'intérieur de COM, est-ce juste un thread Windows que nous utilisons dans l'application C++? S'il vous plaît expliquer ou me donner une référence. Mon plan consiste à créer deux threads T1, T2. T1 traitera les messages de procA et mettra à jour un objet global. Et T2 accédera également à cet objet global en tant que requête Excel pour mettre à jour les valeurs. Donc, l'objet global doit être verrouillé. Est-ce que ce modèle va bien? – Nimo

+0

@Nimo: Oui: si vous pensiez à enfiler le modèle de "Free", alors "Neutral" est presque toujours une meilleure option. Généralement, les composants ne créent pas eux-mêmes de threads (les clients ou le runtime COM le font). Si vous avez besoin d'un thread de travail, vous devez vous assurer de le gérer entièrement, non seulement pour l'initialiser pour COM, mais aussi pour tous les problèmes typiques d'une librairie tournant un thread (par exemple gérer COM décharger votre dll). – Richard