2010-11-04 4 views
0

J'ai un thread qui appelle diverses API d'une interface COM. Maintenant, je veux invoquer ces fonctions d'un autre thread. Pouvez-vous s'il vous plaît conseiller comment je peux y parvenir? Comment puis-je implémenter la communication entre ces deux threads? Si je définis une sorte de structure de données de la file d'attente de messages commune à ces deux threads, comment puis-je définir une structure de données commune car les paramètres sont différents pour chaque API COM.Structure de données multithread C++ pour la communication entre deux threads

Merci d'avance

+1

Vous devrez fournir un peu plus de détails. Pourquoi avez-vous besoin d'une file d'attente de messages? Les appels COM sont généralement synchrones. –

Répondre

1

Vous ne définissez pas une structure de données commune. Il existe une structure de données différente pour chaque signature de fonction différente. La seule chose commune entre ces structures est l'identifiant de la fonction. Dans votre thread, vous aurez un switch géant (ou std :: map) qui traduirait l'identifiant de fonction pour fonctionner lui-même. Après cela, vous savez interpréter le reste de la structure. Les structures devraient avoir une sémantique POD.

2

La méthode standard consiste à utiliser les rappels. Vous passez vos données rondes via un pointeur. Vous pouvez soit utiliser le polymorphisme pour remplacer la méthode que la classe de base appelle lorsque vous le sortez de la file d'attente. Base appelle la fonction x, vous remplacez la fonction x dans les classes dérivées pour atteindre ce que vous voulez.

Une autre méthode consiste à utiliser des rappels anciens. Vous passez l'adresse de votre fonction dans une file d'attente avec toutes les données dont vous avez besoin, enveloppées proprement dans une structure. Tous les rappels doivent avoir la même signature, vous aurez donc probablement besoin de jeter vos données pour les annuler.

1

Si chaque thread est en cours d'exécution en tant que single-threaded apartment alors vous pouvez faire des appels sur les API nécessaires à partir d'un fil à distance en canalisant son pointeur d'interface comme IStream de thread possédant à l'autre fil de l'objet via CoMarshalInterThreadInterfaceInStream et CoGetInterfaceAndReleaseStream. Une fois que le thread distant a un pointeur d'interface, vous pouvez effectuer des appels directement sur celui-ci.

Vous pouvez également le faire plus simplement en utilisant le Global Interface Table, en fonction du modèle de thread de votre application. Ce serait le moyen le plus facile.

Questions connexes