Quando si invia un messaggio "se la finestra specificata è stata creata dal thread chiamante, la procedura della finestra viene richiamata immediatamente come subroutine". Ma "se la finestra specificata è stata creata da un thread diverso, il sistema passa a quel thread e richiama la procedura di finestra appropriata.I messaggi inviati tra thread vengono elaborati solo quando il thread di ricezione esegue il codice di recupero dei messaggi" (preso da MSDN documentazione per SendMessage
).Come viene eseguito SendMessage da un thread diverso?
Ora, non capisco come (o, più propriamente, quando) la procedura di Windows di destinazione si chiama. Ovviamente il thread di destinazione non verrà anticipato (il contatore del programma non viene modificato). Presumo che la chiamata avverrà durante alcune funzioni di attesa (come GetMessage
o PeekMessage
), è vero? Quel processo è documentato in dettaglio da qualche parte?
Aggiornamento: la logica dietro di esso si spiega con la QS_SENDMESSAGE
bandiera di GetQueueStatus()
e MsgWaitForMultipleObjects()
:
QS_SENDMESSAGE
A message sent by another thread or application is in the queue.
Questo, insieme con osservazioni aggiuntive nella documentazione MSDN, significa che un messaggio inviato da un altro thread è effettivamente pubblicato in coda. Quindi, non appena GetMessage
o PeekMessage
vengono chiamati, verrà elaborato prima di qualsiasi altro messaggio inviato per essere inviato direttamente alla procedura della finestra.
Grazie, questo sicuramente risponde al mio dubbio. Sfortunatamente nella documentazione Get/PeekMessage di Windows CE 6 mancava quella parte nella sezione "Note" (mi chiedo se WinCE GWES abbia un comportamento leggermente diverso rispetto a USER Win32). – Wizard79
La documentazione GetMessage dice che "invia i messaggi inviati in entrata fino a quando un messaggio inviato non è disponibile per il recupero." Ecco perché SendMessage dice "i messaggi inviati tra i thread vengono elaborati solo quando il thread ricevente esegue il codice di recupero dei messaggi". L'invio di un messaggio a un thread diverso richiede pertanto che il thread di destinazione abbia un loop di messaggi. L'invio di un messaggio sullo stesso thread comporta una chiamata alla procedura diretta della finestra sullo stesso thread. L'invio di un messaggio a un altro thread comporta una chiamata alla procedura diretta della finestra sul thread di destinazione * all'interno di una chiamata GetMessage *. – Triynko
Ora, per quanto riguarda la priorità dei messaggi inviati e inviati, è molto chiaro. Se il loop del messaggio di destinazione è in attesa di messaggi da pubblicare (ovvero si blocca all'interno di una chiamata GetMessage), un messaggio inviato verrà elaborato per primo se arriva prima di un messaggio inviato. Se il loop del messaggio di destinazione sta effettivamente elaborando un messaggio (cioè chiama Translate o DispatchMessage), allora un messaggio inviato verrà elaborato prima di un messaggio inviato, anche se arriva più tardi, purché arrivi al momento in cui il loop del messaggio di destinazione termina l'elaborazione qualunque messaggio sia nel mezzo dell'elaborazione. – Triynko