Perché PeekMessage prima GetMessage?
-
27-09-2019 - |
Domanda
Perché è necessaria la dichiarazione PeekMessage prima GetMessage () per la creazione di coda di messaggi?
Soluzione
Non è richiesto.
Quello che a volte si vede, però, è un filo che non è pronto ad elaborare i messaggi ancora, ma vuole essere in grado di riceverli nella sua coda di messaggi. Nuove discussioni non hanno code di messaggi subito, ma chiamando PeekMessage
è sufficiente per creare la coda di messaggi. Si ritorna immediatamente poiché non v'è alcun messaggio, e che permette al filo di continuare a ottenere per sé pronto. Nel frattempo, gli altri thread possono iniziare a fare la coda dei messaggi per il nuovo thread. Una volta che il nuovo thread è pronto, si chiama GetMessage
a uno recuperare il primo messaggio dalla coda, o aspettare un messaggio di essere inserito nella coda.
Altri suggerimenti
Non è. Le due funzioni fanno cose diverse.
PeekMessage (...) non aspetta per un messaggio da visualizzare - diventa il primo se è lì, opzionalmente rimuovendolo dalla coda pure, ma ritorna subito falsi non ce n'è uno. E 'più comune nelle applicazioni in cui si sta facendo un po' di elaborazione durante l'attesa per i messaggi, e non si può semplicemente lì sedersi e aspettare per sempre per il messaggio successivo. giochi in tempo reale e come facilmente cadere in questa categoria.
GetMessage (...) attende finchè c'è un messaggio, e lo ottiene. E 'CPUwise più efficiente, perché non è costantemente polling, ma sarà una pausa, se non ci sono messaggi. E 'più comune nelle applicazioni formy e altri programmi che non richiedono costante elaborazione in tempo reale per essere in corso.
Ci sono diverse ragioni per l'utilizzo di PeekMessage
prima / invece di GetMessage
:
- Garantire il programma non si bloccherà fino a quando arriva un messaggio - che è un po 'ridondante, perché è possibile utilizzare direttamente
PeekMessage
con la bandieraPM_REMOVE
per interrogare la coda dei messaggi e lasciare fuoriGetMessage
del tutto. - Uso della funzione con
PM_NOREMOVE
e decidere se si desidera elaborare e / o rimuovere il messaggio dalla coda, oppure no. - Calling
IsWindowUnicode
sulla maniglia della finestra dei messaggi restituiti e selezionandoPeekMessageA
oPeekMessageW
. - Multiple di quanto sopra.