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
:
- Asegurar que el programa no se cuelgue hasta que llegue un mensaje, es un poco redundante, porque puede usar
PeekMessage
directamente con el indicadorPM_REMOVE
para sondear la cola de mensajes y omitirGetMessage
. - Usar la función con
PM_NOREMOVE
y decidir si desea procesar y / o eliminar el mensaje de la cola, o no. - Llamar a
IsWindowUnicode
en el identificador de ventana de los mensajes devueltos y seleccionarPeekMessageA
oPeekMessageW
. - Múltiple de los anteriores.