2011-07-21 21 views

Respuesta

17

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.

4

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.

+0

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. –

+0

+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. –

3

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.

+3

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. –

2

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.

+3

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". –

+0

"Semántica" son para idiomas naturales. El código es lo que hace el código, no lo que se supone que significa. –

+1

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. –

Cuestiones relacionadas