Udostępnij przez


Synchronizacja połączeń

Aplikacje COM muszą mieć możliwość poprawnego radzenia sobie z danymi wejściowymi użytkownika podczas przetwarzania co najmniej jednego wywołania z modelu COM lub systemu operacyjnego. Com zapewnia synchronizację połączeń tylko dla apartamentów jednowątkowych. Wielowątkowe apartamenty (zawierające wątki bez wątków) nie odbierają wywołań podczas wykonywania wywołań (w tym samym wątku). Wielowątkowe apartamenty nie mogą wykonywać zsynchronizowanych wywołań wejściowych. Wywołania asynchroniczne są konwertowane na wywołania synchroniczne w wielowątkowym mieszkaniach. Filtr wiadomości nie jest wywoływany dla żadnego wątku w mieszkaniu wielowątkowym. Aby uzyskać więcej informacji na temat problemów z wątkami, zobacz Procesy, Wątki i Apartamenty.

Wywołania MODELU COM między procesami dzielą się na trzy kategorie w następujący sposób:

Wywołania synchroniczne

Większość komunikacji, która odbywa się w modelu COM, jest synchroniczna. Podczas wykonywania synchronicznych wywołań obiekt wywołujący czeka na odpowiedź przed kontynuowaniem i może odbierać przychodzące wiadomości podczas oczekiwania. Com wprowadza modalną pętlę w celu oczekiwania na odpowiedź, odbieranie i wysyłanie innych komunikatów w kontrolowany sposób.

powiadomienia asynchroniczne

Podczas wysyłania powiadomień asynchronicznych obiekt wywołujący nie czeka na odpowiedź. Model COM używa PostMessage lub zdarzeń wysokiego poziomu do wysyłania powiadomień asynchronicznych w zależności od platformy. Com definiuje pięć metod asynchronicznych IAdviseSink:

Nuta

Podczas gdy com przetwarza wywołanie asynchroniczne, nie można wykonać wywołań synchronicznych. Na przykład implementacja aplikacji kontenera OnDataChange nie może zawierać wywołania metody IPersistStorage::Save. Te wywołania są jedynymi wywołaniami asynchronicznymi obsługiwanymi przez com. Obecnie nie ma możliwości utworzenia interfejsu niestandardowego, który jest asynchroniczny.

 

wywołania zsynchronizowane z danymi wejściowymi

Podczas wykonywania wywołań zsynchronizowanych z danymi wejściowymi obiekt o nazwie musi wykonać wywołanie przed uzyskaniem kontroli. Pomaga to zagwarantować, że zarządzanie fokusem działa prawidłowo i że dane wprowadzone przez użytkownika są odpowiednio przetwarzane. Te wywołania są wykonywane przez com za pośrednictwem funkcji SendMessage bez wprowadzania pętli modalnej. Podczas przetwarzania wywołania zsynchronizowanego z danymi wejściowymi obiekt o nazwie nie może wywoływać żadnej funkcji ani metody (w tym metod synchronicznych), które mogą kontrolować. Następujące metody są synchronizowane z danymi wejściowymi

Aby zminimalizować problemy, które mogą wynikać z asynchronicznego przetwarzania komunikatów, większość wywołań metod COM jest synchroniczna. W przypadku komunikacji synchronicznej nie ma potrzeby specjalnego kodu do wysyłania i obsługi komunikatów przychodzących. Gdy aplikacja wykonuje wywołanie metody synchronicznej, com wprowadza modalną pętlę oczekiwania, która obsługuje wymagane odpowiedzi i wysyła komunikaty przychodzące do aplikacji, które mogą je przetwarzać.

Com zarządza wywołaniami metod, przypisując identyfikator o nazwie identyfikator wątku logicznego. Nowy jest przypisywany, gdy użytkownik wybierze polecenie menu lub gdy aplikacja inicjuje nową operację COM. Kolejne wywołania odnoszące się do początkowego wywołania COM są przypisane do tego samego identyfikatora wątku logicznego co początkowe wywołanie.