HOWTO: ATL에서 스레드 풀(Thread-Pooled), 분산 모델 COM 서버 구현

이 문서는 이전에 다음 ID로 출판되었음: KR244495
이 문서가 보관되었습니다. "그대로" 제공되었으며, 업데이트가 되지 않을 것입니다.
요약
Microsoft Active Template Library(ATL)를 사용하면 생성된 개체가 자신만의 스레드에서 실행하도록 ATL 독립 프로세스(Out Of Process) 서버에 STA 스레드의 풀을 정의할 수 있습니다. 이 작업을 수행하는 방법은 본 문서의 "추가 정보" 절에서 설명합니다.
추가 정보
스레드 풀에서 개체를 만들려면 아래와 같은 단계를 수행해야 합니다.
  1. 아래의 클래스로부터 CExeModule 또는 CServiceModule 클래스를 만듭니다.
    CComAutoThreadModule<>
    CExeModule : public CComAutoThreadModule<>
  2. STA 풀 스레드에서 실행될 수 있는 각 ATL 클래스에서 DECLARE_CLASSFACTORY_AUTO_THREAD()를 선언합니다.
  3. STA 풀 스레드에서 실행될 수 있는 각 ATL 클래스에서 DECLARE_NOT_AGGREGATABLE()을 선언합니다.
    DECLARE_NOT_AGGREGATABLE(CMyPooledObject)
  4. 아래 메서드를 호출하기 위해 모듈 CExeModule::Unlock() 또는 CServiceModule::Unlock() 메서드를 수정합니다.
    CComAutoThreadModule<>::Unlock()
    LONG CExeModule::Unlock(){   LONG l = CComAutoThreadModule<>::Unlock();   if (l == 0)   {     bActivity = true;     SetEvent(hEventShutdown); // tell monitor that we transitioned to zero   }   return l;}
서비스를 위해 이 작업을 수행하는 경우에는 추가로 한 단계가 더 필요합니다. 다음의 코드를
inline void CServiceModule::Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, UINT nServiceNameID, const GUID* plibid){   CComModule::Init(p, h, plibid);
아래와 같이 수정합니다.
inline void CServiceModule::Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, UINT nServiceNameID, const GUID* plibid){   CComAutoThreadModule<>::Init(p, h, plibid);
기본적으로 ATL은 프로세서 당 네 개의 스레드를 가진 풀을 만듭니다. 선택적인 네 번째 매개 변수에 스레드의 개수를 지정함으로써 tWinMain() 함수의 _Module.Init() 호출에서 이를 변경할 수 있습니다. 기본적으로 CComAutoThreadModule은 스레드 할당자(Thread Allocator)로 CComSimpleThreadAllocator를 사용합니다. CComSimpleThreadAllocator는 간단한 라운드 로빈(Round Robin) 구성표를 사용하여 스레드 풀에서 개체를 만듭니다.
참조
자세한 내용은 DECLARE_CLASS_FACTORY_AUTO_THREAD(), CComAutoThreadModule 및 MSDN(Microsoft Developer's Network)을 참조하십시오.

202128 BUG: ATL EXE Server Based on CComAutoThreadModule May Hang on Registration
속성

문서 ID: 244495 - 마지막 검토: 01/10/2015 12:14:39 - 수정: 1.0

  • Microsoft ActiveX Template Library 3.0
  • kbnosurvey kbarchive kbactivex kbarchitecture kbatl300 kbcomt kbgrpmfcatl kblocalsvr kbservice kbthread kbvc600 KB244495
피드백