다음을 통해 공유


호출 동기화

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

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

동기 호출

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

비동기 알림

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

  • OnDataChange
  • OnViewChange
  • onRename
  • OnSave
  • OnClose

메모

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

 

입력 동기화 호출

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

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

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