통화 동기화

COM 애플리케이션은 COM 또는 운영 체제에서 하나 이상의 호출을 처리하는 동안 사용자 입력을 올바르게 처리할 수 있어야 합니다. COM은 단일 스레드 아파트에 대해서만 통화 동기화를 제공합니다. 다중 스레드 아파트(자유 스레드 스레드 포함)는 (동일한 스레드에서) 전화를 걸 때 전화를 받지 않습니다. 다중 스레드 아파트는 입력 동기화된 통화를 할 수 없습니다. 비동기 통화는 다중 스레드 아파트의 동기 통화로 변환됩니다. 다중 스레드 아파트의 스레드에 대해 메시지 필터가 호출되지 않습니다. 스레딩 문제에 대한 자세한 내용은 프로세스, 스레드 및 아파트를 참조하세요.

프로세스 간의 COM 호출은 다음과 같이 세 가지 범주로 구분됩니다.

동기 호출

COM 내에서 발생하는 대부분의 통신은 동기적입니다. 동기 호출을 수행할 때 호출자는 계속하기 전에 회신을 대기하고 대기하는 동안 들어오는 메시지를 받을 수 있습니다. COM은 모달 루프를 입력하여 회신을 기다리며 다른 메시지를 제어된 방식으로 수신하고 디스패치합니다.

비동기 알림

비동기 알림을 보낼 때 호출자는 회신을 기다리지 않습니다. COM 은 플랫폼에 따라 PostMessage 또는 상위 수준 이벤트를 사용하여 비동기 알림을 보냅니다. COM은 IAdviseSink의 5가지 비동기 메서드를 정의합니다.

참고

COM이 비동기 호출을 처리하는 동안에는 동기 호출을 수행할 수 없습니다. 예를 들어 컨테이너 애플리케이션의 OnDataChange 구현에는 IPersistStorage::Save에 대한 호출이 포함될 수 없습니다. 이러한 호출은 COM에서 지원하는 유일한 비동기 호출입니다. 현재 비동기인 사용자 지정 인터페이스를 만들 수 있는 방법은 없습니다.

 

입력 동기화된 호출

입력 동기화된 호출을 만들 때 호출된 개체는 제어를 생성하기 전에 호출을 완료해야 합니다. 이렇게 하면 포커스 관리가 올바르게 작동하고 사용자가 입력한 데이터가 적절하게 처리되도록 할 수 있습니다. 이러한 호출은 모달 루프를 입력하지 않고 SendMessage 함수를 통해 COM에서 이루어집니다. 입력 동기화 호출을 처리하는 동안 호출된 개체는 제어를 생성할 수 있는 함수 또는 메서드(동기 메서드 포함)를 호출해서는 안 됩니다. 다음 메서드는 입력 동기화됨

비동기 메시지 처리로 인해 발생할 수 있는 문제를 최소화하기 위해 대부분의 COM 메서드 호출은 동기적입니다. 동기 통신을 사용하면 들어오는 메시지를 디스패치하고 처리하는 특수 코드가 필요하지 않습니다. 애플리케이션이 동기 메서드를 호출하면 COM은 필요한 회신을 처리하고 들어오는 메시지를 처리할 수 있는 애플리케이션에 디스패치하는 모달 대기 루프를 입력합니다.

COM은 논리 스레드 ID라는 식별자를 할당하여 메서드 호출을 관리합니다. 사용자가 메뉴 명령을 선택하거나 애플리케이션이 새 COM 작업을 시작할 때 새 명령이 할당됩니다. 초기 COM 호출과 관련된 후속 호출에는 초기 호출과 동일한 논리 스레드 ID가 할당됩니다.