Me preguntaba cuál es la diferencia entre llamar a SendMessage (que bloquea) y llamar a PostMessage junto con WaitForSingleObject. ¿Pensamientos?SendMessage vs PostMessage + WaitForSingleObject
Respuesta
SendMessage()
se puede denegar, si se llama desde el contexto de una llamada COM, donde el objeto COM vive en una STA (las llamadas se envían a través de la bomba de mensajes). PostMessage()
no está restringido a cumplir con las reglas de apartamentos COM.
Además, PostMessage()
pone el mensaje al final de la cola de mensajes de la ventana. SendMessage()
omite la cola. Puede encontrar un debate más extenso sobre las colas de mensajes en el blog de Raymond Chen The Old New Thing.
Mi punto es que hay más en la diferencia entre SendMessage()
y PostMessage()
de lo que parece. Realmente recomiendo ir a través del blog de Raymond, ya que ha cubierto muchos problemas a lo largo de los años.
PostMessage
y WaitForSingleObject
le permiten hacer mensajes asincrónicos. Puede enviar un mensaje, hacer otras cosas y volver a consultar para obtener una respuesta más adelante. SendMessage
es sincrónico y requiere que espere.
Supongo que debería haber mencionado que mi objetivo es lograr la sincronicidad. Haría PostMessage y lo seguiría inmediatamente con una llamada a WaitForSingleObject. –
+1 para resaltar la diferencia operativa principal: PostMessaging un evento y esperar en él permite que la persona que llama continúe procesando. Esto puede ser útil si el objetivo es esperar en una etapa posterior del procesamiento de subprocesos hasta que un mensaje publicado previamente se haya manejado por completo en el subproceso de GUI. –
Siempre he pensado que SendMessage llama directamente a su procedimiento de Windows, omitiendo la cola de mensajes; mientras que PostMessage solo agrega el mensaje a la cola.
Eso depende de desde qué subproceso se llame a SendMessage(). Las llamadas entre rejas siempre se organizan a través de la bomba y no se envían directamente al winproc. –
SendMessage es una sola llamada API, por lo tanto, menos propenso a sus errores. Vaya con el built-in en lugar de rodar el suyo.
No es que sea menos propenso a errores. Las funciones tienen un propósito semántico muy diferente. Su elección de usar uno u otro debe basarse en lo que desea lograr, no solo cómo puedo hacer que este código "funcione". –
"Semántica" son para idiomas naturales. El código es lo que hace el código, no lo que se supone que significa. –
No, semántica para facilitar la legibilidad del código, la auto-documentación y la adhesión a los contratos de la API. El hecho de que el código haga algo ahora no significa que siempre continuará haciendo lo mismo. Y solo porque el implementador sepa lo que hace el código no significa que el mantenedor posterior sabrá por qué hizo algo de una manera completamente no obvia e intuitiva. –
- 1. SendMessage vs. WndProc
- 2. .Net Timeouts: WaitForSingleObject vs Timer
- 3. Extensiones Chrome - onRequest/sendRequest vs onMessage/sendMessage
- 4. No puedo entender cómo usar las llamadas a SendMessage o PostMessage
- 5. Buscando la funcionalidad PostMessage en Qt
- 6. Cómo usar WaitForSingleObject
- 7. SendMessage (HWND_BROADCAST cuelga
- 8. Comunicación de subprocesos usando SendMessage
- 9. Arrastrar y soltar usando SendMessage
- 10. ¿Por qué bloquea WaitForSingleObject (INVALID_HANDLE_VALUE, INFINITE)?
- 11. WaitForSingleObject en un identificador de archivo?
- 12. ¿WaitForSingleObject funciona como una barrera de memoria?
- 13. ¿Puede un múltiplo de disparo único SetEvent() WaitForSingleObject()
- 14. ¿Cómo puedo hacer postMessage entre dominios?
- 15. ¿Cómo puedo saber quién llamó a SendMessage?
- 16. Cómo crear lParam de SendMessage WM_KEYDOWN
- 17. Enviando/recibiendo una cadena a través de PostMessage
- 18. "máquina del sueño" + + WaitForSingleObject tiempo de espera finita
- 19. ¿Por qué html5 postMessage no funciona para mí?
- 20. PostMessage con múltiples funciones o devoluciones de llamada personalizadas
- 21. Cualquier buen depurador para HTML5 Javascript postMessage API?
- 22. PostMessage desde WorkerThread a la ventana principal en MFC
- 23. iframe altura dinámica dominio cruzado usando jquery.ba-postmessage
- 24. Explicación de los números de mensaje de SendMessage?
- 25. asincrónicamente GetForegroundWindow a través de SendMessage o algo?
- 26. ¿Cómo se ejecuta SendMessage desde un hilo diferente?
- 27. WM_COPYDATA SendMessage - ¿Puede enviar grandes cadenas de caracteres?
- 28. objeto mutex vs eventos en Windows
- 29. PostMessage() tiene éxito pero mi código de procesamiento de mensajes nunca recibe el mensaje
- 30. ¿Cómo uso correctamente el método WaitForSingleObject para esperar a que termine un programa externo?
Si desea sincronizar llame a SendMessage. –