2010-05-26 10 views
5

Estoy trabajando en un proyecto que implica reutilizar y migrar parte del código MFC existente a C#.Subprocesos C# - Publicar mensajes entre subprocesos

El código actual en MFC, crea algunos subprocesos y utiliza :: PostthreadeMessage() y ON_THREAD_MESSAGE (msg, func) para la comunicación asíncrona entre subprocesos a través de mensajes.

:: PostthreadeMessage() -> envía un mensaje a un id. De subproceso en particular. ON_THREAD_MESSAGE (msg, func) -> llama a la función (func) cuando se recibe un mensaje (msg).

Como no conozco las interfaces de subprocesamiento en C#, traté de buscar API similares en C#, pero no pude encontrar ninguna.

Sería muy bueno, si alguien me puede ayudar en la búsqueda de las funciones apropiadas para este fin en C#

+0

que depende de que el hilo de recepción tenga una bomba de mensajes (y por lo tanto una ventana), ¿no es así? –

Respuesta

1

Aquí está el consejo de C# MVP Nicholas Paldino:

Si envías al hilo, y no a una ventana específica, entonces tendrá que tener algo que implementa la interfaz IMessageFilter, y luego pasar ese aplicación al método AddMessageFilter estática en el Clase de aplicación, por lo que puede manejar el mensaje que viene en el hilo .

Del otro hilo, tendrá para utilizar el método API PostThreadMessage a través de la capa P/Invocar.

+1

Existe un riesgo para este enfoque. PostThreadMessage publica un mensaje utilizando el threadId, pero la relación entre el threadId y un hilo administrado no es fijo. Desde MSDN "Un ThreadId de sistema operativo no tiene una relación fija con un subproceso administrado, porque un host no administrado puede controlar la relación entre subprocesos gestionados y no gestionados". http://msdn.microsoft.com/en-us/library/74169f59.aspx –

+0

Gracias a Chris y Mitch !!! Solo necesito un par de aclaraciones sobre sus sugerencias. Mencionaste sobre la API PostThreadMessage. ¿Es el de user32 dll, que puedo importar y usar? Si es así, ¿dónde exactamente debería implementar la interfaz IMessageFilter y por qué? Sin implementarlo, ¿no puedo importar los mensajes getmessage y postthread de user32 dll y usarlos? Gracias! – Harsha

1

Le aconsejaría que no haga un puerto directo para esta parte (comunicación entre hilos) de la aplicación. Puede ser que pueda verificar si puede usar delegados y eventos. Un delegado podría registrarse al inicio y estos delegados (devoluciones de llamada) podrían ser llamados en lugar del mensaje del usuario.

1

Si sus subprocesos están en C# y está en .NET 4, simplemente usaría ConcurrentQueue<T> y pondría en cola los mensajes de un hilo y luego los consumiría del otro.

+0

¡Gracias por la información! Estoy en .NET3.5. Mis hilos serán creados en C# y necesitan comunicarse entre ellos.Además, cada subproceso usará un dll de MFC y, a partir de ese código de MFC, quiero comunicarme con el otro subproceso en C# utilizando el id. De subproceso. Espero que te dé una idea! – Harsha

Cuestiones relacionadas