Domanda

In esecuzione su XP. Ho un cliente che chiama le chiamate CoInitializeEx(NULL, COINIT_MULTITHREADED), carica un (locale) oggetto DCOM, e si attacca un'interfaccia evento così l'oggetto DCOM può rispedire eventi. Il cliente assomiglia molto a blocco note con un multi-linea di testo che copre l'area client di visualizzare messaggi di evento. Qui ci sono le chiamate che creano un lock-up:

  • client chiama p->DoStuff() sull'oggetto DCOM.
  • L'oggetto DCOM chiama c->DoStuffEvent() sul client durante l'elaborazione DoStuff().
  • Il client invia un messaggio alla casella di testo EM_REPLACESEL bambino di averlo visualizzare "roba che sta accadendo"

Il client si blocca sulla SendMessage(EM_REPLACESEL). La chiamata del cliente al p->DoStuff() è fatto su un thread principale mentre il SendMessage(EM_REPLACESEL) è fatto su un thread diverso. Sono sicuro che questo ha qualcosa a che fare con il problema.

Qualcuno può spiegare che cosa sta causando il blocco e come avrei potuto lavorare intorno ad esso? Gli oggetti client e DCOM sono codificati da me in MSVC / ATL, in modo che io sia in grado di modificare, se necessario.

È stato utile?

Soluzione

Sembrerebbe che la finestra è stata creata dal thread principale. In modo che sia l'unico filo che può chiamare il proc finestra. Quando si SendMessage dal l'altro thread, ciò che effettivamente fa per mettere il messaggio nella coda del thread principale e quindi attendere che il thread principale per chiamare GetMessage o PeekMessage. All'interno della chiamata a GetMessage o PeekMessage, Windows nota un attesa SendMessage cross-thread e passa il messaggio alla finestra proc, poi si sveglia il secondo thread e lo lascia continuare.

Se non si preoccupano il valore di ritorno di SendMessage(EM_REPLACESEL), è possibile utilizzare SendNotifyMessage . Ma se si fa questo, è necessario assicurarsi che la stringa si passa con il messaggio EM_REPLACESEL è ancora valido quando il messaggio viene finalmente consegnato.

Altri suggerimenti

Come per la SendMessage documentazione, SendMessage non ritorna fino al completamento della funzione. È sincrona. Credo che sia sempre risposto sul thread UI pure. Se si vuole fare un passaggio messaggio asincrono, quindi si dovrebbe utilizzare PostMessage .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top