Синхронизация вызовов
COM-приложения должны иметь возможность правильно работать с входными данными пользователя при обработке одного или нескольких вызовов из COM или операционной системы. COM обеспечивает синхронизацию вызовов только для однопоточных квартир. Многопоточные квартиры (содержащие свободные потоки) не получают вызовы при выполнении вызовов (в одном потоке). Многопоточные квартиры не могут выполнять входные синхронизированные вызовы. Асинхронные вызовы преобразуются в синхронные вызовы в многопоточных квартирах. Фильтр сообщений не вызывается для любого потока в многопоточной квартире. Дополнительные сведения о проблемах с потоком см. в разделе "Процессы", "Потоки" и "Квартиры".
Вызовы COM между процессами делятся на три категории, как показано ниже.
-
Синхронные вызовы
-
Большая часть взаимодействия, которая происходит в COM, синхронна. При синхронных вызовах вызывающий ожидает ответа, прежде чем продолжить и может получать входящие сообщения во время ожидания. COM вводит модальный цикл для ожидания ответа, получения и отправки других сообщений управляемым образом.
-
Асинхронные уведомления
-
При отправке асинхронных уведомлений вызывающий объект не ожидает ответа. COM использует PostMessage или высокоуровневые события для отправки асинхронных уведомлений в зависимости от платформы. COM определяет пять асинхронных методов IAdviseSink:
Примечание.
Хотя COM обрабатывает асинхронный вызов, синхронные вызовы невозможно сделать. Например, реализация приложения контейнера OnDataChange не может содержать вызов IPersist служба хранилища::Save. Эти вызовы являются единственными асинхронными вызовами, поддерживаемыми COM. В настоящее время не существует способа создать пользовательский интерфейс, асинхронный.
-
Вызовы, синхронизированные с входными данными
-
При выполнении входных синхронизированных вызовов объект должен завершить вызов перед получением элемента управления. Это помогает обеспечить правильную работу управления фокусом и правильность обработки данных, введенных пользователем. Эти вызовы выполняются com через функцию SendMessage без ввода модального цикла. При обработке входного синхронизированного вызова объект не должен вызывать какие-либо функции или методы (включая синхронные методы), которые могут привести к управлению. Следующие методы синхронизированы
- IOleWindow::GetWindow
- IOleInPlaceActiveObject::OnFrameWindowActivate
- IOleInPlaceActiveObject::OnDocWindowActivate
- IOleInPlaceActiveObject::ResizeBorder
- IOleInPlaceUIWindow::GetBorder
- IOleInPlaceUIWindow::RequestBorderSpace
- IOleInPlaceUIWindow::SetBorderSpace
- IOleInPlaceFrame::SetMenu
- IOleInPlaceFrame::SetStatusText
- IOleInPlaceObject::SetObjectRects
Чтобы свести к минимуму проблемы, возникающие при асинхронной обработке сообщений, большинство вызовов метода COM синхронны. При синхронном взаимодействии не требуется специального кода для отправки и обработки входящих сообщений. Когда приложение вызывает синхронный метод, COM вводит модальный цикл ожидания, который обрабатывает необходимые ответы и отправляет входящие сообщения приложениям, способным их обрабатывать.
COM управляет вызовами методов путем назначения идентификатора, называемого идентификатором логического потока. Новый назначается, когда пользователь выбирает команду меню или когда приложение инициирует новую операцию COM. Последующие вызовы, относящиеся к первоначальному com-вызову, назначаются тем же идентификатором логического потока, что и начальный вызов.