problemilla con el paso de mensajes de Windows

Kaworu
27 de Enero del 2006
Hola,

Con VC++ tengo una clase generica tengo un thread simulando señales, cada vez ke genera una nueva le envio un mensaje a otra clase genérica que las promedia usando PostThreadMessage y teniendo como global el id del thread para promediar, ya que no me ha funcionado de ninguna otra manera. Esta clase tiene un thread recogiendo los mensajes con un GetMessage, si hay una medida disponible la recoge, la promedia y lanzo un PostThreadMessage al thread de la app ke tb lo tengo en una variable global, y la app se lo pasa al dialogo principal con un puntero que mantengo.

Esto es un poco guarrillo, creo yo, a falta de saberlo hacerlo mejor. Lo malo de verdad es que ahora no se como enviar el mensaje a algun otro dialogo que haya abierto. Puedo procesar el mensaje en el dialogo principal, en un no modal al tener el puntero y poder hacer pDlg->PostMessage y también en la ventana actiava con CWnd* pWnd = GetActiveWindow (); pWnd->PostMessage. Pero esto no siempre me sirve.

He probado de todo, registrar los dialogos como clase de CWnd, todas las posibilidades de PostMessage, SendMessage, ..., y no me ha funcionado de ninguna manera.

Por favor, ¿alguien sabe pq $%$#~€@~#€ los dialogos no reciben el mensaje?

Gracias!

kike.ado
27 de Enero del 2006
hola
Primero que nada aclaro que no controlo demasiado el tema de los threads, asi que perdona si la cago.

MFC tiene una clase CEvent que genera un objeto suceso por omision sin señalizar y despues el hilo puede modificar su estado usando sus funciones, te puede ser util para pulir la comunicacion entre hilos y creo que tambien puedes leer eventos desde los dialogos.
Si pienso en la posibilidad de derivar una clase de CEvent y colocarle miembros que contengan las señales que debe enviar, el hilo secundario las cargaria y fijaria el estado del evento en señalizado.
El hilo principal podria revisar (WaitForSingleObject de win32)para determinar el estado del evento y si esta activado actualizar sus datos y dialogos.
La verdad es que esto solo lo he usado de forma inversa, es decir el hilo principal fijaba un evento cuando queria que el secundario se bloquease o siguiera adelante y en este caso use un objeto CEvent sin derivar mi propia clase, pero pienso que puede ser interesante probarlo, asi te ahorras los mensajes.
Si decides probarlo me dices si ha funcionado, pa saberlo.
Un saludo

Kaworu
27 de Enero del 2006
Hola y primero de todo gracias por leer el toston y contestar.

La verdad es que no he usado mucho la clase CEvent, pero será questión de mirarselo. Tiene pinta de ke vaya a poder generar más o menos lo mismo pero de otra manera. Lo ke si se es ke los dialogos y los controles igual que los dialogos, pueden responder a los eventos ke kieras declarandolos igual ke los mensajes pero usando BEGIN_EVENTSINK_MAP. Así es como implemente una derivada del FlexGrid 6.0 para poder escribir en las teclas, respondiendo al evento -603, OnKeyPress.

Aunke lo cierto es ke me jode un monton, pq funciona todo bien, pero los mensajes no llegan, es por eso que había pensado hacer más o menos lo mismo ke me propones de hacer un constructor con CWnd* y salvar su puntero, pero usando una templeta ke hice hace tiempo y así mantenerlos en un array, no es muy pulido pero seguramente funcione. Porque hoy, igual ke capturo la ventana activa con GetActiveWindow he probado de pillar todas las ventanas con pWnd = GetWindow (GW_HWNDFIRST) y while (pWnd = GetWindow (GW_HWNDPREV)), esto en teoria, devuelve la primera ventana de todas y va hacia atras en la Z hasta quedarse sin ventanas, cuando peta, devuelve 0, y sale del bucle, pero lo cierto es ke no se pq el muy hijo puta se keda pillao devolviendome todo el rato la misma ventana. He probado de mantener dos punteros a Wnd para comprobar cuando se repite, pero es un asco y no recuerdo pq pero no iva mu fino. Así que he visto un método CALLBACK para enumerar las ventanas, pero el hijo puta se lia a darme ventanas que no se de donde se las saca y no termina nunca.

Lo que si he podido ver hoy es que pongo un mensaje en un dialogo no modal y el principal no responde a el aunke esta declarado, pero si lo busco en pretanslatemessage si lo pillo, pero solo la ventana principal, una modal o otra no modal no lo recibe.

Bueno, gracias, hasta luego, y si saco algo en claro te lo digo.

kike.ado
27 de Enero del 2006
Hay estas funciones para moverse entre niveles de la jerarquia de ventanas
CWnd* GetParent( ) ;//para acceder al padre
CWnd* GetNextWindow( UINT nFlag = GW_HWNDNEXT );//para moverte entre los hijos
Por si te pueden servir.

Kaworu
27 de Enero del 2006
Hola,

La de GetNextWindow no la conocia, y lo que he visto es ke podia recibir el mensaje en el pretranslate de la App, del dialgo principal y del que lo lanzaba, pero no puedo moverme entre mensaje las "del mismo nivel".

Antes de probar lo del CEvent, pq es mas largo, me he decido ha probar lo de la template guardando el HWND de cada ventana que abro y asi si funciona.

Si me da por probar lo de CEvent ya te lo dire, la verdad es ke ahora mismo con lo rayado que he acabado la guarrada esa ya me vale.

Hasta luego y gracias!

kike.ado
27 de Enero del 2006
Has pensado en un constructor, en todos los dialogos, con parametro CWnd* y guardar el puntero del dialogo padre, para la comunicacion entre dialogos y eso...