2010-05-26 9 views
5

Je travaille sur un projet qui implique la réutilisation et la migration d'une partie du code MFC existant vers C#.Threads C# - Publication de messages entre threads

Le code actuel dans MFC, crée des threads et utilise :: PostthreadeMessage() et ON_THREAD_MESSAGE (msg, func) pour la communication asynchrone inter-thread via les messages.

:: PostthreadeMessage() -> envoie un message à un ID de thread particulier. ON_THREAD_MESSAGE (msg, func) -> appelle la fonction (func) lorsqu'un message (msg) est reçu. Comme je ne suis pas très au courant des interfaces de threading en C#, j'ai essayé de rechercher des API similaires en C#, mais je n'ai pas réussi à en trouver.

Ce serait bien, si quelqu'un peut me aider à trouver les fonctions appropriées à cet effet en C#

+0

qui repose sur le thread de réception ayant une pompe de msg (et donc une fenêtre) n'est-ce pas? –

Répondre

1

est ici les conseils de C# MVP Nicholas Paldino:

Si vous envoyez des messages sur le fil, et pas à une fenêtre spécifique, alors vous devrez avoir quelque chose que implémente l'interface IMessageFilter , puis passez cette implémentation à la méthode AddMessageFilter sur le classe d'application, de sorte qu'il peut gérer le message qui vient sur le thread . De l'autre thread, vous aurez pour utiliser la méthode PostThreadMessage API via la couche P/Invoke.

+1

Il existe un risque pour cette approche. PostThreadMessage publie un message à l'aide de l'ID de thread, mais la relation entre l'ID de thread et un thread géré n'est pas résolue. De MSDN «Un ThreadId du système d'exploitation n'a pas de relation fixe à un thread géré, car un hôte non géré peut contrôler la relation entre les threads gérés et non gérés. http://msdn.microsoft.com/en-us/library/74169f59.aspx –

+0

Merci à Chris et Mitch !!! Juste besoin de quelques précisions supplémentaires sur vos suggestions. Vous avez mentionné l'API PostThreadMessage. Est-ce celui de dll user32, que je peux dllimport et l'utiliser? Si tel est le cas, alors où exactement devrais-je implémenter l'interface IMessageFilter et pourquoi? Sans l'implémenter, ne puis-je pas importer le message getmessage et postthreadmessage à partir de dll user32 et l'utiliser? Merci! – Harsha

1

Je vous déconseille de faire un port direct pour cette partie (communication entre threads) de l'application. Peut-être pouvez-vous vérifier si vous pouvez utiliser des délégués et des événements. Un délégué pourrait être enregistré au démarrage et ces délégués (rappels) pourraient être appelés à la place du message de l'utilisateur.

1

Si vos deux threads sont en C# et que vous êtes sur .NET 4, j'utiliserais simplement un ConcurrentQueue<T> et mettrait en file d'attente les messages d'un thread, puis les consommerais de l'autre.

+0

Merci pour l'info !! Je suis sur .NET3.5. Mes discussions seront créées en C# et doivent communiquer entre elles.En outre, chaque thread utilisera une DLL MFC, et à partir de ce code MFC, je veux communiquer à l'autre thread en C# en utilisant l'ID de thread. J'espère que ça vous donne une idée !!! – Harsha