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 에서이 매개 변수입니다.