다음을 통해 공유


TN064: 아파트 모델 스레딩에서 ActiveX 컨트롤

[!참고]

온라인 설명서의을 처음 포함 되었습니다 때문 다음 기술 참고 업데이트 되지 않았습니다.따라서 일부 절차 및 항목 오래 되었거나 잘못 된 수 있습니다.최신 정보는 온라인 설명서 색인에서 관심 있는 주제에 대해 검색 하는 것이 좋습니다.

이 기술 노트는 ActiveX 컨트롤의 아파트 모델 스레딩 사용 하는 방법에 설명 합니다.Note Visual C++ 버전 4.2 이상 아파트 모델 스레딩 에서만 지원 됩니다.

아파트 모델 스레딩 이란 무엇입니까?

아파트 모델 다중 스레드 컨테이너 응용 프로그램 내에서 ActiveX 컨트롤 같은 포함 된 개체를 지원 하는 방법입니다.다중 스레드 응용 프로그램이 있더라도 "에서 스레드를 하나만 실행 하는 하나의 아파트,"에 포함 된 개체의 각 인스턴스에 할당 됩니다.즉, 모든 호출에 컨트롤의 인스턴스가 동일한 스레드에서 발생 합니다.

그러나 컨트롤을 동일한 형식의 다른 인스턴스에 다른 아파트에 할당 될 수 있습니다.컨트롤의 여러 인스턴스 (예: 전역 또는 정적 데이터)를 공통에서 데이터를 공유 하는 경우, 다음이 공유 데이터 액세스 동기화 개체를 임계 섹션으로 보호할 수 해야 합니다.

아파트 스레딩 모델에 대 한 전체 세부 정보를 참조 하십시오 프로세스 및 스레드 에 있는 OLE 프로그래머용 참조.

지원 되는 이유는 아파트 모델 스레딩?

또한 아파트 모델을 지 원하는 컨테이너를 다중 스레드 응용 프로그램에서 아파트 모델 스레딩 지 원하는 컨트롤을 사용할 수 있습니다.아파트 모델 스레딩 사용 하지 않을 경우, 잠재적인 집합을 컨테이너에서 해당 컨트롤을 사용할 수 제한 됩니다.

아파트 모델 스레딩 활성화 거의 또는 전혀 공유 데이터 경우에 특히 대부분의 컨트롤에 대 한 간단 합니다.

공유 데이터 보호

공유 데이터 컨트롤을 사용 하는 경우 정적 멤버 변수를 같은 데이터 둘 이상의 스레드가 데이터를 동시에 수정 하지 못하게 방지 하는 임계 섹션으로 보호할 수 액세스 합니다.이 목적을 위해 임계 영역 위로 설정 하려면 클래스의 정적 멤버 변수를 선언 합니다. CCriticalSection 컨트롤의 클래스입니다.사용은 Lock 및 잠금 해제 이 중요 섹션의 멤버 함수 개체 코드가 공유 데이터에 액세스 하는 곳입니다.

예를 들어, 모든 인스턴스에서 공유 되는 문자열을 유지 해야 하는 컨트롤 클래스를 고려 합니다.이 문자열 임계 섹션에 의해 보호 되 고 정적 멤버 변수에서 유지 있습니다.컨트롤의 클래스 선언에 다음 내용이 포함 됩니다.

class CSampleCtrl : public COleControl
{
    ...
    static CString _strShared;
    static CCriticalSection _critSect;
};

클래스의 구현은 이러한 변수에 대 한 정의가 포함 됩니다.

int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect;

액세스는 _strShared 정적 멤버 다음 중요 섹션에 의해 보호 됩니다.

void CSampleCtrl::SomeMethod()
{
    _critSect.Lock();
    if (_strShared.Empty())
        _strShared = "<text>";
    _critSect.Unlock();
    ...
}

등록 된 아파트 모델 인식 컨트롤

아파트 모델 스레딩 지 원하는 컨트롤 해야 나타내는이 기능은 레지스트리에서 "ThreadingModel" 명명 된 값을 추가 하 여 "아파트" 값이 해당 클래스 ID 레지스트리 항목 아래에 있는 클래스 id\InprocServer32 키입니다.이 키가 컨트롤에 대해 자동으로 등록 하려면 전달의 afxRegApartmentThreading 플래그에서 여섯 번째 매개 변수를 AfxOleRegisterControlClass:

BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
    if (bRegister)
        return AfxOleRegisterControlClass(
            AfxGetInstanceHandle(),
            m_clsid,
            m_lpszProgID,
            IDS_SAMPLE,
            IDB_SAMPLE,
            afxRegApartmentThreading,
            _dwSampleOleMisc,
            _tlid,
            _wVerMajor,
            _wVerMinor);
    else
        return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}

컨트롤 프로젝트를 Visual C++ 버전 4.1 이상을 컨트롤에서 생성 된 경우이 플래그가 이미 코드에 표시 됩니다.변경할 스레딩 모델을 등록할 필요가 없습니다.

기존 코드 프로젝트 컨트롤은 이전 버전에서 생성 된 경우 부울 값 여섯 번째 매개 변수로 가집니다.기존 매개 변수가 TRUE 이면 바꾸어 afxRegInsertable | afxRegApartmentThreading.기존 매개 변수가 FALSE 이면 변경 afxRegApartmentThreading.

컨트롤이 아파트 모델 스레딩 규칙을 따르지 않는 경우 않습니다 통과 해야 afxRegApartmentThreading 에서이 매개 변수입니다.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트