Bonjour,

Je souhaite réaliser une application serveur DCOM (out of process). Elle dispose d’une interface d’échange avec les objets COM clients qui dispose de plusieurs fonctions. Notamment une fonction qui lance l’exécution d’un sleep d’une durée passée en paramètre.

Actuellement, je suis parvenu à réaliser ce serveur COM avec cette fonction « wait » qui sérialise les appels clients. Les « waits » s’exécutent les uns après les autres sur mon serveur de type MultiInstance, tmApartment.
Mon objectif maintenant est de pouvoir, sur une seule instance de l’exécutable du serveur effectuer plusieurs « waits » en parallèle.
Pour cela je suis passé en tmfree (multi-threaded apartment). Je parviens à être réentrant et donc à recevoir les différents appellent de la fonction par le client. Je lance ensuite des threads secondaires qui attendent le temps souhaité pour chaque fonction. Mon thread principal possède une boucle d’attente (qui réalise des processmessages rendant ainsi l’a fonction réentrante) qui attend un message envoyé par les threads qui se terminent.

A la fin de chaque thread je sort de ma fonction principale.
Mon problème est que le lancement des threads et des boucles d’attentes se font toujours dans le thread principal de mon application. Les appels de fonction de mon interface COM s’empilent donc et se dépilent à chaque fin de fonction. La première fonction à se terminer est donc toujours la dernière appelée quelque soit son temps d’attente. Cela semble correspondre à cette situation dans la FAQ sur COM/OLE/ATL :

DCOM ne garantit pas qu'il n'y ait qu'une seule requête en cours d'exécution à chaque instant, même dans un appartement monothreadé. En effet, les méthodes des composants peuvent parfaitement être appelées de manière réentrante. Ces appels peuvent être faits de manière interne par le composant, ou provenir du traitement d'un autre message de la boucle des messages. Ce dernier cas suppose que le thread de l'appartement retourne dans cette boucle, situation qui se produit dès qu'un appel à destination d'un objet d'un autre appartement est fait. Dans ce cas, le thread de l'appartement peut parfaitement recevoir le message provenant d'une requête d'exécution d'une autre méthode, ou de la même méthode qu'il était en train de traiter. DCOM ne contrôle pas cette situation, et tous les composants DCOM doivent donc être réentrants.

Or, ce que je souhaiterais, c’est que plutôt que les appels réentrants s’empilent, ils soient directement traités dans des threads différents. Je veux que le premier terminé soit le premier sorti quelque soit l’ordre des appels. Et qu’ils n’arrivent donc pas tous dans le même thread principal. Comment puis-je réaliser cela ? Comment puis-je rendre mon serveur multithreadé ? Comment créer les threads appelables par COM ? Comment les appels peuvent ils être dispatchés sur les threads disponibles ?

Merci pour votre aide.

Cordialement,