Diversi tipi di gestori di interrupt del sistema operativo deve essere trasmettere i messaggi in detta coda dei messaggi' ', ma dove all'interno dello spazio di indirizzamento del processo risiede questa coda? Come viene esposto al codice del gestore di interrupt?
Le finestre sono associate ai thread. Ogni thread con una finestra ha una coda di thread nello spazio degli indirizzi del processo. Il sistema operativo ha una coda interna nel proprio spazio indirizzo per gli eventi generati dall'hardware. Usando i dettagli dell'evento e altre informazioni sullo stato (ad es., Quale finestra ha il focus), il sistema operativo traduce gli eventi hardware in messaggi che vengono quindi inseriti nella coda dei thread appropriata.
I messaggi inviati vengono inseriti direttamente nella coda di thread per la finestra di destinazione.
I messaggi inviati vengono generalmente elaborati direttamente (ignorando la coda).
I dettagli diventano pelosi. Ad esempio, le code di thread sono più che elenchi di messaggi, inoltre mantengono alcune informazioni di stato. Alcuni messaggi (come WM_PAINT) non sono realmente accodati, ma sintetizzati dalle informazioni di stato aggiuntive quando si interroga la coda ed è vuoto. I messaggi inviati a finestre di proprietà di altri thread vengono effettivamente inviati alla coda del destinatario anziché essere elaborati direttamente, ma il sistema lo fa apparire come un normale invio di blocco dal punto di vista del chiamante. L'ilarità si verifica se questo può causare deadlock (a causa di mandate circolari al thread originale).
I libri di Jeffrey Richter hanno molti (tutti?) Dei dettagli cruenti. La mia edizione è vecchia (Windows avanzato). L'edizione corrente sembra essere chiamata Windows via C/C++.
Il sistema operativo esegue MOLTO lavoro per rendere il flusso dei messaggi razionale (e relativamente semplice) al chiamante.
Che cosa significa "tradurre" il messaggio? Che cosa fa veramente la chiamata a TranslateMessage()?
Controlla i messaggi chiave virtuali e, quando riconosce una combinazione di tasti giù/chiave, aggiunge messaggi di carattere. Se non chiami TranslateMessage, non riceverai messaggi di caratteri come WM_CHAR.
Sospetto che invii il messaggio di carattere direttamente prima di tornare (al contrario di pubblicarli). Non ho mai controllato, ma mi sembra di ricordare che i messaggi WM_CHAR arrivano poco prima del WM_KEYUP.
Una volta inviato da DispatchMessage(), quali sono tutte le posizioni in cui il messaggio oscilla prima di raggiungere il mio WndProc (cioè cosa fa il sistema operativo con esso)?
DispatchMessage passa il messaggio al WndProc per la finestra di destinazione. Lungo la strada, alcuni ganci possono avere la possibilità di vedere il messaggio (e possibilmente interferire con esso).
Questo è tutto sbagliato. Le parti di esso che sono corrette, sono corrette solo se la domanda riguardava Win16 in cui l'intero sistema operativo e le applicazioni erano pianificate in modo cooperativo su un singolo thread. –