Cuando enviamos un mensaje, "si la ventana especificada fue creada por el hilo de llamada, el procedimiento de ventana se llama inmediatamente como una subrutina". Pero "si la ventana especificada fue creada por un hilo diferente, el sistema cambia a ese hilo y llama al procedimiento de ventana apropiado. Los mensajes enviados entre hilos se procesan solo cuando el hilo receptor ejecuta el código de recuperación de mensaje" (tomado de MSDN documentación para SendMessage
).¿Cómo se ejecuta SendMessage desde un hilo diferente?
Ahora, no entiendo cómo (o, más apropiadamente, cuando ) el procedimiento ventanas de destino se llama. Por supuesto, el hilo de destino no será reemplazado (el contador del programa no se cambia). Supongo que la llamada se producirá durante alguna función de espera (como GetMessage
o PeekMessage
), ¿es verdad? Ese proceso está documentado en detalle en alguna parte?
Actualización: la razón de que se explica por la bandera QS_SENDMESSAGE
de GetQueueStatus()
y MsgWaitForMultipleObjects()
:
QS_SENDMESSAGE
A message sent by another thread or application is in the queue.
Esto, junto con las observaciones adicionales en la documentación de MSDN, significa que un mensaje enviado por otro el hilo se publica realmente en la cola. Luego, tan pronto como se llamen a GetMessage
o PeekMessage
, se procesará antes de que se envíe cualquier otro mensaje publicado directamente al procedimiento de ventana.
Gracias, esto definitivamente responde mi duda. Desafortunadamente en la documentación Get/PeekMessage de Windows CE 6 esa parte faltaba en la sección "Comentarios" (me pregunto si WinCE GWES tiene un comportamiento diferente y sutil que Win32 USER). – Wizard79
La documentación de GetMessage dice que "despacha mensajes enviados entrantes hasta que un mensaje publicado esté disponible para su recuperación". Es por eso que SendMessage dice "los mensajes enviados entre hilos se procesan solo cuando el hilo receptor ejecuta el código de recuperación de mensajes". En consecuencia, enviar un mensaje a un hilo diferente requiere que el hilo objetivo tenga un bucle de mensaje. Enviar un mensaje en el mismo subproceso resulta en una llamada de procedimiento de ventana directa en el mismo subproceso. Enviar un mensaje a otro hilo da como resultado una llamada al procedimiento de ventana directa en el hilo * objetivo desde una llamada GetMessage *. – Triynko
Ahora, en lo que respecta a la prioridad de los mensajes enviados y publicados, está muy claro. Si el bucle de mensaje de destino está esperando a que se publiquen los mensajes (es decir, está bloqueando dentro de una llamada de GetMessage), un mensaje enviado se procesará primero si llega antes de un mensaje publicado. Si el bucle de mensaje de destino está procesando un mensaje (es decir, llamando a Translate o DispatchMessage), un mensaje enviado se procesará antes de un mensaje publicado, incluso si llega más tarde, siempre que llegue antes de que el bucle de mensaje de destino termine de procesarse cualquier mensaje que esté en medio del procesamiento. – Triynko