• Martes 7 de Mayo de 2024, 00:03

Autor Tema:  Mensaje de un hilo a otro  (Leído 1408 veces)

termidor

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Mensaje de un hilo a otro
« en: Lunes 25 de Enero de 2010, 23:05 »
0
Hola,
Estoy haciendo dos pequeñas aplicaciones; un servidor que únicamente manda datos a un cliente, y el cliente que los tiene que mostrar en un cuadro de diálogo. En el cliente tengo dos hilos: uno que se encarga de las comunicaciones con el servidor, y otro que tiene que refrescar el diálogo cuando hay datos nuevos. Ambos hilos comparten unas variables globales. El problema es que el hilo que refresca el diálogo no se entera de cuando hay datos nuevos. Para solucionar esto he intentado que el hilo de comunicaciones, al recibir los datos, le mande un mensaje al hilo que refresca el diálogo con PostThreadMessage:

PostThreadMessage(idHiloDeRefresco, WM_USER + 30, 0,0);

Pero lo que no sé es como hacer en el otro hilo para recoger ese mensaje. ¿alguna idea?

Muchas gracias y un saludo

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Mensaje de un hilo a otro
« Respuesta #1 en: Martes 26 de Enero de 2010, 10:12 »
0
Código: C++
  1.  
  2.  
  3. MSG Msg;
  4. while (PeekMessage(&Msg,NULL,0,0,PM_REMOVE)!=0)
  5.         {
  6.         TranslateMessage(&Msg);
  7.                 DispatchMessage(&Msg);      
  8.         }
  9.  
  10.  

tienes que recibir los mensajes de windows simplemente. Y poner ese identificador de mensaje en el Procedure del otro hilo.
Si no usas procedure, simplemente mira manualmente el mensaje en el propio message pump.

PD: tambien puedes usar otros mecanismos de comunicacion, en el foro deberia haber un post que pregunté yo al respecto.

termidor

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Mensaje de un hilo a otro
« Respuesta #2 en: Martes 26 de Enero de 2010, 13:29 »
0
Si, pero, ese bucle while, ¿donde lo meto?. Porque yo lo que tengo es el hilo principal que ahora mismo solo responde a los clásicos eventos de ventana (repintar cuando se oculta una parte, pulsación de botones, etc...), pero no sé en que función meter ese bucle while para que se esté ejecutando "mientras no está pasando nada", por decirlo de alguna forma.

Ahora buscaré el hilo que me dices, muchas gracias.

rfog

  • Miembro MUY activo
  • ***
  • Mensajes: 166
    • Ver Perfil
Re: Mensaje de un hilo a otro
« Respuesta #3 en: Martes 26 de Enero de 2010, 15:23 »
0
Amoavé...

¿En qué estás haciéndolo? ¿MFC, Win32, C++/CLI (Windows Forms)?

Porque ese bucle lo tienes que tener, o bien a la vista o bien oculto por MFC...

En ambos casos, debes responder a ese WM_USER+30, que por cierto podrías hacerte un define) en el bucle de mensajes. En MFC tienes que añadirte un evento al estilo de

   ON_MESSAGE(WM_USER_DEVICE_READY,&CTestEVODlg::OnDeviceReady)
   ON_MESSAGE(WM_USER_DATA_VALID,&CTestEVODlg::OnDataValid)
   ON_MESSAGE(WM_USER_RETRYPAY,&CTestEVODlg::OnRetryEscalator)
   ON_MESSAGE(WM_USER_ERROR,&CTestEVODlg::OnError)

Y en Win32 simplemente capturar el mensaje en el bucle.

Y por supuesto que no se te olvide usar el HWND correcto cuando envíes el mensaje.

Por cierto, esta es la forma "oficial" de comunicar entre hilos de una misma aplicación.
Microsoft Visual C++ MVP - Mi blog sobre programación: http://geeks.ms/blogs/rfog

termidor

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Mensaje de un hilo a otro. Solucionado
« Respuesta #4 en: Jueves 28 de Enero de 2010, 23:26 »
0
Hola,
perdonad por no haber respondido antes, pero he tenido mucho lío en el curro y un problema médico. Debido a esto no he podido implementar la solución, pero sí me ha dado tiempo a hacer una pequeña prueba y parece que, efectivamente, el bucle de mensajes es la solución. Muchas gracias, rfog, por ayudarme a encontrarlo. Efectivamente es una aplicación MFC y el bucle está oculto. Muchas gracias por la ayuda. Creo que a partir del domingo tendré un poco mas de tiempo e implementaré la solución bien, pero seguro que funciona. Os informaré de todos modos.

Y no te preocupes, desde luego pondré un define para el evento.  ^_^

Muchas gracias de nuevo.