pass open from event ejemplo data windows mfc postmessage

windows - open - window addeventlistener iframe



¿Los mensajes de PostMessage() aparecen ordenados en Windows? (4)

La pregunta general es: si publico varios mensajes en la bomba de mensajes de Windows de un hilo de trabajo separado, ¿aparecerán en su destino en el orden que envié? es decir..

::PostMessage(m_hUsers, WM_BULKPROCESS, 0, 0); // ... some processing here ... ::PostMessage(m_hUsers, WM_BULKDONE, 0, 0);

m_hUsers es un identificador (HWND) de una ventana a la que estoy enviando mensajes desde mi hilo de trabajo. Entonces, WM_BULKPROCESS siempre aparecerá primero en la ventana (y por lo tanto será procesado por el manejador en esa clase de diálogo), o es posible que se salgan de orden, es decir, WM_BULKDONE se procesa antes de WM_BULKPROCESS, aunque se haya enviado el último ?


Deberían serlo a menos que tengas un código en la bomba de mensajes que específicamente distribuya los mensajes (ya sea intencionalmente o no) de manera diferente, por ejemplo, de alguna manera eliges dos mensajes y los desordenes. Normalmente los programadores llaman a DispatchMessage para cada mensaje en el orden que obtienes de la cola.


Hay algunas excepciones (como WM_PAINT), pero en general, se mantiene el orden de los mensajes. Imágenes que intentan dar sentido a la entrada del mouse si los mensajes aparecen en el orden incorrecto.

Cita de GetMessage

Durante esta llamada, el sistema entrega mensajes pendientes, no en cola, es decir, mensajes enviados a ventanas propiedad de la cadena de llamada utilizando las funciones SendMessage, SendMessageCallback, SendMessageTimeout o SendNotifyMessage. A continuación, se recupera el primer mensaje en cola que coincide con el filtro especificado. El sistema también puede procesar eventos internos. Si no se especifica ningún filtro, los mensajes se procesan en el siguiente orden:

Sent messages Posted messages Input (hardware) messages and system internal events Sent messages (again) WM_PAINT messages WM_TIMER messages


Los mensajes de la ventana se almacenan en una cola. Entonces puede confiar en el mecanismo FIFO.


Sospecho que el problema es la sincronización y no la cola de mensajes. Si su código permite invocaciones multitubulares del procceso de subprocesos de trabajador, debe gestionarlo más estrechamente para saber qué "instancia" del subproceso de trabajo está publicando los mensajes.

¿Ha comprobado que solo se está ejecutando un subproceso de trabajo a la vez, o que el identificador de la ventana de m_hUsers está protegido contra el cambio entre BULKPROCESS y BULKDONE?

SendMessage puede ser útil para administrar BULKDONE porque se bloqueará hasta que el mensaje se haya procesado, permitiendo que el código que invoca el subproceso de trabajo sincronice la invocación de subprocesos de trabajo y sepa que un subproceso de trabajo ha finalizado antes de invocar otro. El postmensaje no se bloqueará, pero recuerde que la parte de su hilo de trabajo que es sensible al tiempo es `// ... algún procesamiento aquí ... no envía los mensajes de Windows.