Sincronizzazione delle chiamate
Le applicazioni COM devono essere in grado di gestire correttamente l'input dell'utente durante l'elaborazione di una o più chiamate da COM o dal sistema operativo. COM fornisce la sincronizzazione delle chiamate solo per appartamenti a thread singolo. Gli appartamenti multithreading (contenenti thread senza thread) non ricevono chiamate durante l'esecuzione di chiamate (sullo stesso thread). Gli appartamenti multithreading non possono effettuare chiamate sincronizzate di input. Le chiamate asincrone vengono convertite in chiamate sincrone in appartamenti multithreading. Il filtro dei messaggi non viene chiamato per alcun thread in un apartment multithreading. Per altre informazioni sui problemi di threading, vedere Processi, thread e appartamenti.
Le chiamate COM tra processi rientrano in tre categorie, come indicato di seguito:
-
Chiamate sincrone
-
La maggior parte delle comunicazioni che avviene all'interno di COM è sincrona. Quando si effettuano chiamate sincrone, il chiamante attende la risposta prima di continuare e può ricevere messaggi in arrivo durante l'attesa. COM entra in un ciclo modale per attendere la risposta, la ricezione e l'invio di altri messaggi in modo controllato.
-
Notifiche asincrone
-
Quando si inviano notifiche asincrone, il chiamante non attende la risposta. COM usa PostMessage o eventi di alto livello per inviare notifiche asincrone, a seconda della piattaforma. COM definisce cinque metodi asincroni di IAdviseSink:
Nota
Mentre COM elabora una chiamata asincrona, non è possibile effettuare chiamate sincrone. Ad esempio, l'implementazione di OnDataChange di un'applicazione contenitore non può contenere una chiamata a IPersist Archiviazione::Save. Queste chiamate sono le uniche chiamate asincrone supportate da COM. Al momento non è possibile creare un'interfaccia personalizzata asincrona.
-
Chiamate sincronizzate con input
-
Quando si effettuano chiamate sincronizzate con input, l'oggetto chiamato deve completare la chiamata prima di restituire il controllo. Ciò consente di garantire che la gestione dello stato attivo funzioni correttamente e che i dati immessi dall'utente vengano elaborati in modo appropriato. Queste chiamate vengono effettuate da COM tramite la funzione SendMessage , senza immettere un ciclo modale. Durante l'elaborazione di una chiamata sincronizzata con input, l'oggetto chiamato non deve chiamare alcuna funzione o metodo (inclusi i metodi sincroni) che potrebbero produrre il controllo. I metodi seguenti sono sincronizzati
- IOleWindow::GetWindow
- IOleInPlaceActiveObject::OnFrameWindowActivate
- IOleInPlaceActiveObject::OnDocWindowActivate
- IOleInPlaceActiveObject::ResizeBorder
- IOleInPlaceUIWindow::GetBorder
- IOleInPlaceUIWindow::RequestBorderSpace
- IOleInPlaceUIWindow::SetBorderSpace
- IOleInPlaceFrame::SetMenu
- IOleInPlaceFrame::SetStatusText
- IOleInPlaceObject::SetObjectRects
Per ridurre al minimo i problemi che possono verificarsi dall'elaborazione asincrona dei messaggi, la maggior parte delle chiamate ai metodi COM è sincrona. Con la comunicazione sincrona, non è necessario un codice speciale per inviare e gestire i messaggi in arrivo. Quando un'applicazione effettua una chiamata al metodo sincrono, COM immette un ciclo di attesa modale che gestisce le risposte necessarie e invia i messaggi in ingresso alle applicazioni in grado di elaborarli.
COM gestisce le chiamate ai metodi assegnando un identificatore denominato ID thread logico. Ne viene assegnato uno nuovo quando un utente seleziona un comando di menu o quando l'applicazione avvia una nuova operazione COM. Alle chiamate successive correlate alla chiamata COM iniziale viene assegnato lo stesso ID thread logico della chiamata iniziale.