delphi winapi peekmessage getmessage idle-processing

delphi - ¿Por qué peekmessage antes de getmessage?



winapi idle-processing (3)

No es obligatorio.

Sin embargo, lo que a veces verá es un hilo que todavía no está listo para procesar mensajes, pero desea poder recibirlos en su cola de mensajes. Los nuevos subprocesos no tienen colas de mensajes de inmediato, pero llamar a PeekMessage es suficiente para crear la cola de mensajes. Vuelve inmediatamente ya que no hay ningún mensaje, y eso permite que el hilo continúe preparándose. Mientras tanto, otros hilos pueden comenzar a poner en cola mensajes para el nuevo hilo. Una vez que el nuevo hilo está listo, llama a GetMessage para recuperar el primer mensaje de la cola, o para esperar a que un mensaje se coloque en la cola.

¿Por qué se requiere la declaración peekMessage antes de Getmessage () para crear cola de mensajes?


No es. Las dos funciones hacen cosas diferentes.

PeekMessage (...) no espera a que aparezca un mensaje: recibe el primero si está allí, también lo elimina opcionalmente de la cola, pero devuelve falso inmediatamente, no hay ninguno. Es más común en las aplicaciones donde está procesando algo mientras espera los mensajes, y no puede simplemente quedarse sentado y esperar el siguiente mensaje para siempre. Los juegos en tiempo real y tales entran fácilmente en esta categoría.

GetMessage (...) espera hasta que haya un mensaje y lo recibe. Es más eficiente en cuanto a la CPU, porque no es un sondeo constante, pero se detendrá si no hay ningún mensaje. Es más común en las aplicaciones formy y otros programas que no requieren un procesamiento constante en tiempo real.


Existen múltiples razones para usar PeekMessage antes / en lugar de GetMessage :

  1. Asegurar que el programa no se cuelgue hasta que llegue un mensaje, es un poco redundante, porque puede usar PeekMessage directamente con el indicador PM_REMOVE para sondear la cola de mensajes y omitir GetMessage .
  2. Usar la función con PM_NOREMOVE y decidir si desea procesar y / o eliminar el mensaje de la cola, o no.
  3. Llamar a IsWindowUnicode en el identificador de ventana de los mensajes devueltos y seleccionar PeekMessageA o PeekMessageW .
  4. Múltiple de los anteriores.