2010-09-17 5 views
2

Je suis sur le point d'écrire un contrôle qui a ce défaut. Pourquoi exactement est-ce mauvais?Blocage dans l'objet STA COM

Votre contrôle ActiveX a un défaut commun qui seul thread (STA) les objets ActiveX & COM doit éviter: des objets COM STA ne peut pas effectuer opérations de blocage sur le thread STA, sauf si l'objet COM aussi pompes Messages Windows. Par conséquent, si votre contrôle doit effectuer une opération de blocage synchrone, il doit mettre en œuvre une pompe de message Windows en attendant que l'opération de blocage soit terminée.

Source

Je ne veux pas pomper des messages alors que je bloque parce que semble provoquer mon toexecute javascript mode rentrante. ce qui est vraiment mauvais.

Répondre

3

Vous devez autoriser le thread STA à pomper les messages car sinon, les appels ne peuvent pas être envoyés au thread STA: puisqu'il y a déjà un thread dans l'appartement (et un seul thread, duh) aucun autre thread ne peut entrer dans l'appartement , donc l'envoi d'un message à la fenêtre des discussions (cachées) est le "seul" moyen de communiquer avec le thread STA.

Ceci est utilisé pour traiter des requêtes ORPC, mais également pour traiter des messages qui ne sont pas nécessairement liés à COM (c'est-à-dire des messages GUI). Interrompre le traitement des messages en effectuant un appel bloquant perturbe ainsi la fonctionnalité ORPC et peut potentiellement bloquer également l'interface utilisateur.

Voir Don Box "Essential COM" pour des informations complètes sur COM.

1

Vous n'avez rien à pomper manuellement. Essayez d'utiliser CoWaitForMultipleHandles au lieu de MsgWaitForMultipleObjects dans l'extrait du forum et laissez COM pomper uniquement les messages d'appel inter-thread.

Questions connexes