2009-01-16 21 views
5

mi pregunta es: ¿cómo puedo usar SendMessage() para implementar la comunicación de subprocesos entre dos subprocesos, uno con una ventana (GUI) y el otro sin ventana?Comunicación de subprocesos usando SendMessage

El problema es que SendMessage() necesita un identificador (HWND)?

Otro detalle sobre mi proyecto: Dos hilos, una ejecución de código (el que tiene la interfaz de usuario) gestiona, así como el código nativo otra carrera (el uno sin ventana)

Muchas gracias!

+0

SendMessage es una función muy peligroso para ser utilizando en un entorno multi-hilo, ya que no es seguro para subprocesos y puede dar lugar a puntos muertos (hablo desde experiencia). –

Respuesta

3

Tal vez usted debe tratar de utilizar PostMessage o PostThreadMessage

+0

Me gusta PostThreadMessage mucho. ¿Hay una versión de bloqueo de esta función? Porque PostThreadMessage vuelve sin esperar a que el destinatario procese el mensaje. –

+0

No. No sería demasiado difícil implementar una versión de bloqueo: use PostThreadMessage y luego tenga el bloque de hilos de llamada en un evento que el destinatario establecerá cuando haya procesado el mensaje. –

2

Si el hilo no tiene ventana, hay cola de mensajes, y ningún despachador de mensajes, entonces va a ser difícil para un mensaje a ella. Es común que los subprocesos creen ventanas ocultas solo para fines de comunicación (eche un vistazo con Windows Spy y verá muchos ejemplos).

Una alternativa es usar memoria compartida y una primitiva de sincronización como un evento o semáforo. Otra alternativa es usar tubos.

2

qué dijo @jdigital. Tenga en cuenta que si crea una ventana oculta y su hilo no implementa ya un bucle de mensaje (ya sea en el lenguaje win32 habitual o en el contexto de un COM STA), y si no tiene idea de lo que estoy hablando entonces probablemente uno no exista en su hilo), también querrá crear un bucle de mensaje. ATL lo hace bastante fácil con _AtlModule.RunMessageLoop(); Desafortunadamente, esto también significa que el hilo en cuestión probablemente deba ser controlado por eventos mientras está en el bucle de mensajes. Puedes hacer cosas complicadas como MsgWaitForMultipleObjects, pero se pone peludo.

Aquí hay un ejemplo de hidden windows si está familiarizado con ATL/COM. Pasé por este dolor hace un tiempo y pensé que había una discusión útil en microsoft.public.vc.atl, pero lo mejor que puedo encontrar ahora es this post. que detalla algunas variantes de los bucles de mensajes (qué hacer de forma diferente si tiene aceleradores de pulsaciones de teclas o ventanas no moderadas, suena como que no lo hace en su aplicación).

Cuestiones relacionadas