Foros del Web » Programación para mayores de 30 ;) » C/C++ »

SendMessage VS PostMessage

Estas en el tema de SendMessage VS PostMessage en el foro de C/C++ en Foros del Web. Tengo una duda y no termino de aclararme. ¿por qué para unos mensajes se usa una y para otros otra? He visto esto: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); ...
  #1 (permalink)  
Antiguo 09/04/2016, 14:38
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
SendMessage VS PostMessage

Tengo una duda y no termino de aclararme. ¿por qué para unos mensajes se usa una y para otros otra?
He visto esto:
Código C++:
Ver original
  1. PostMessage(FindWindow(NULL, "Main Form Caption"), WM_CLOSE, 0, 0);
Pero yo lo tengo en mi código como:
Código C++:
Ver original
  1. SendMessage(FindWindow(NULL, "Main Form Caption"), WM_CLOSE, 0, 0);
Si ambos funcionan ¿que diferencias hay?
  #2 (permalink)  
Antiguo 09/04/2016, 14:53
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: SendMessage VS PostMessage

Cita:
Iniciado por SendMessage
Sends the specified message to a window or windows. The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message.
Cita:
Iniciado por PostMessage
Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.
Es decir, SendMessage envía el mensaje instantáneamente a la aplicación y PostMessage lo envía a la cola de mensajes del proceso en cuestión.

SendMessage es más prioritario mientras que PostMessage deja que la aplicación procese el mensaje cuando le toque, sin prisas.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 09/04/2016, 20:14
 
Fecha de Ingreso: abril-2016
Mensajes: 31
Antigüedad: 8 años, 1 mes
Puntos: 5
Respuesta: SendMessage VS PostMessage

Cita:
Iniciado por aguml Ver Mensaje
... ¿por qué para unos mensajes se usa una y para otros otra? ...
SendMessage y PostMessage tienen distinto comportamiento, hacen cosas diferentes:

De la documentación:

SendMessage [https://msdn.microsoft.com/en-us/library/ms644950%28VS.85%29.aspx]
Cita:
Sends the specified message to a window or windows. The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message.
hace una llamada sincrónica al procedimiento que maneja el mensaje, y no vuelve hasta que ese procedimiento se haya ejecutado; en el ejemplo que ponés, al método que maneja WM_CLOSE.

PostMessage [https://msdn.microsoft.com/en-us/library/ms644944%28VS.85%29.aspx]
Cita:
Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.
Pone el mensaje en la cola de mensajes de la ventana de destino y vuelve; es asincrónico.

Entonces,
Cita:
Iniciado por aguml Ver Mensaje
Si ambos funcionan ¿que diferencias hay?
La diferencia relevante es el comportamiento; qué hacen más que cómo lo hacen. En algunos casos se podrá usar una u otra con el mismo resultado, pero otras veces tendrá sentido una y no la otra.

Por ejemplo, si se necesita enviar un mensaje en forma sincrónica, no se usará PostMessage; si se necesita que sea asincrónico, no se usará SendMessage.

Última edición por enrieto; 09/04/2016 a las 22:02
  #4 (permalink)  
Antiguo 10/04/2016, 03:03
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: SendMessage VS PostMessage

Ya entiendo. ¿entonces puedo usar cualquiera de los dos para cualquier mensaje? ¿o hay mensajes que uno acepte y el otro no? Es que con lo que me explicáis creo que me interesa en mi aplicación poder elegir en mi aplicación que el mensaje sea sincrónico o asincronico .
Otra cosa, he estado viendo que para el mensaje WM_QUIT hay que usar PostQuitMessage pero lo que no tengo nada claro es que hace ese mensaje ya que si es para cerrar ya tenemos WM_CLOSE ¿no?
EDITO:
He encontrado esto:: http://www.zator.com/Cpp/E1_7_5_1.htm
Dice que si el mensaje es 0 se sale del bucle de mensajes. ¿entonces PostQuitMessage (0) manda el mensaje WM_NULL para que salga del bucle? No lo tengo del todo claro porque si mandando WM_NULL salimos del bucle de mensajes ¿que sentido tiene usar WM_CLOSE o WM_QUIT?

Última edición por aguml; 10/04/2016 a las 09:20
  #5 (permalink)  
Antiguo 10/04/2016, 18:15
 
Fecha de Ingreso: abril-2016
Mensajes: 31
Antigüedad: 8 años, 1 mes
Puntos: 5
Respuesta: SendMessage VS PostMessage

No sé si lo que estás necesitando para tu proyecto es algo simple y rápido, o algo más defendible. El tema de mensajes y notificaciones en Windows está presente desde los primeros días, y hay herramientas (IDEs) que pueden simplificar todo eso haciéndolo "transparente" para el usuario, pero con el pequeño inconveniente de que cuando se necesita entender qué está pasando, o cuando es necesario hacer el trabajo del programador, es cuando uno empieza a dudar si esas simplificaciones fueron un favor o no tanto.

Pero bueno, la información por suerte está disponible, y no es tan imposible de leer. Te propongo una idea, a ver qué te parece: aprovechando que tenés la necesidad, podrías leer la documentación y después presentar acá lo que hayas hecho.

Te paso unos links que creo que vale la pena leerse en una tarde:

About Messages and Message Queues
https://msdn.microsoft.com/en-us/library/ms644927%28v=vs.85%29.aspx

Using Messages and Message Queues
https://msdn.microsoft.com/en-us/library/ms644928%28v=vs.85%29.aspx

Window Notifications
https://msdn.microsoft.com/en-us/library/ff468922%28v=vs.85%29.aspx

Etiquetas: funcion, sendmessage
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:05.