이 기술 노트에서는 아파트 모델 스레딩 ActiveX 컨트롤에서 사용 하는 방법에 설명 합니다. 아파트 모델 스레딩만 지원 하는지 Visual c + + 버전 4.2 이상에서는 note。
아파트 모델 스레딩 무엇입니까?
아파트 모델 스레드 컨테이너 응용 프로그램 내에서 ActiveX 컨트롤과 같은 포함 된 개체를 지 원하는 방식입니다. 응용 프로그램이 여러 스레드를 가질 수 있지만 하나의 "아파트," 단 하나의 스레드에서 실행 하는 포함된 된 개체의 각 인스턴스에 할당 됩니다. 다른 말로 하면, 컨트롤의 인스턴스로 모든 호출이 동일한 스레드에서 일어날 것입니다.
그러나 컨트롤의 동일한 종류의 다른 인스턴스가 다른 아파트에 할당 될 수 있습니다. 따라서, 컨트롤의 여러 인스턴스가 공통 (예를 들어, 정적 또는 글로벌 데이터)의 데이터를 공유 하는 경우 다음이 공유 데이터에 액세스할 필요가 있을 것 이다 같은 중요 섹션 동기화 개체에 의해 보호。
아파트 모델 스레딩에 자세한 내용은 참조 하시기 바랍니다 프로세스와 스레드 OLE 프로그래머용 참조。
왜 지원 아파트 모델 스레딩?
아파트 모델 스레딩 지 원하는 컨트롤을 또한 아파트 모델을 지 원하는 다중 스레드 컨테이너 응용 프로그램에서 사용할 수 있습니다. 아파트 모델 스레딩을 사용 하지 않는 경우 컨테이너 컨트롤이 사용 될 수 있는 잠재적인 집합 제한。
아파트 모델 스레딩 사용 하는 것은 쉽게 대부분의 컨트롤, 특히 만약 그들이 거의 없거나 전혀 없는 공유 데이터。
공유 데이터 보호
컨트롤에 공유 데이터를 사용 하는 경우 정적 멤버 변수를 같은 액세스를 데이터 둘 이상의 스레드가 동시에 데이터를 수정 하지 못하게 하려면 중요 섹션으로 보호 되어야 한다. 이 목적에 대 한 중요 섹션을 설정 하려면 컨트롤의 클래스에서 CCriticalSection 클래스의 정적 멤버 변수를 선언 합니다. 이 중요 섹션 개체의 Lock 및 Unlock 멤버 함수를 사용 하 여 어디에 공유 데이터를 액세스 하는 코드。
고려, 예를 들어, 모든 인스턴스에서 공유 되는 문자열을 유지 해야 하는 컨트롤 클래스. 이 문자열 정적 멤버 변수에서 유지 관리 하 고 중요 섹션에 의해 보호 수 있습니다. 컨트롤의 클래스 선언 다음 포함:
cSampleCtrl 클래스: 공용 COleControl
{
nbsp;? ...
?? 정적 CString _strShared;
?? 정적 CCriticalSection _critSect;
}(&N)
클래스에 대 한 구현은 이러한 변수에 대 한 정의 포함할 것:
int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect
에 대 한 액세스를 _strShared 정적 멤버는 중요 섹션에 의해 보호 받을 수:
void CSampleCtrl::SomeMethod()
{
nbsp;? _critSect.Lock();
?? 경우 (_strShared.Empty())
?????? _strShared = "<text>";
?? _critSect.Unlock();
?? ...
}
아파트 모델 인식 컨트롤 등록
아파트 모델 스레딩 지 원하는 컨트롤 클래스 id아래에 그들의 클래스 ID 레지스트리 항목의 값이 "아파트" 명명 된 값 "ThreadingModel"를 추가 하 여 레지스트리에서이 기능을 표시 해야 \InprocServer32 키. 이 키를 컨트롤에 대해 자동으로 등록 되도록 전달 합니다 afxRegApartmentThreading AfxOleRegisterControlClass 여섯 번째 매개 변수에서는 플래그:
BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
nbsp;? 경우 (bRegister)
?????? AfxOleRegisterControlClass (반환
?????????? AfxGetInstanceHandle(),
?????????? m_clsid,
?????????? m_lpszProgID,
?????????? IDS_SAMPLE,
?????????? IDB_SAMPLE,
?????????? afxRegApartmentThreading,
?????????? _dwSampleOleMisc,
?????????? _tlid,
?????????? _wVerMajor,
?????????? _wVerMinor);
?? 다른
?????? AfxOleUnregisterClass (m_clsid, m_lpszProgID); 반환
}(&N)
컨트롤 프로젝트는 Visual c + + 버전 4.1 이상을 Controlwizard에 의해 생성 된,이 플래그 코드에 이미 있을 것입니다. 변화가 필요한 스레딩 모델을 등록 하는。
프로젝트에 Controlwizard의 이전 버전에서 생성 된 기존 코드에 여섯 번째 매개 변수로 부울 값을 해야한다. 기존 매개 변수가 TRUE 인 경우에 그것을 변경 afxRegInsertable | afxRegApartmentThreading . 기존 매개 변수가 FALSE 인 경우에 그것을 변경합니다 afxRegApartmentThreading。
컨트롤이 아파트 모델 스레딩에 대 한 규칙을 따르지 않는 경우 전달 하지 해야 합니다 afxRegApartmentThreading 이 매개 변수에서。
기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)