TN064: Apartment-Model podprocesu v ovládacích prvcích ActiveX
[!POZNÁMKA]
Následující technické poznámce nebyly aktualizovány od byla poprvé zahrnuta v dokumentaci online.Proto některé postupy a témata mohou být nesprávné nebo zastaralé.Nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.
Tato technická Poznámka vysvětluje, jak povolit model Apartment, typ podprocesu ovládacího prvku ActiveX.Všimněte si, že model Apartment, typ podprocesu je podporována pouze ve Visual C++ verze 4.2 nebo novější.
Co je Model apartment, typ podprocesu?
Apartment model je přístup k podpoře vložené objekty, například ovládací prvky ActiveX v aplikaci kontejneru s více podprocesy.Aplikace může existovat více podprocesů, každou instanci vloženého objektu přiřadit jeden "apartment," který bude proveden pouze jedním podprocesem.Jinými slovy veškerá volání do instance ovládacího prvku dojde ve stejném podprocesu.
Různé apartmány však může být přiřazena různých instancí stejného typu ovládacího prvku.Tak pokud více instancí ovládacího prvku sdílet data společné (například statická nebo globální data), potom přístup k této sdílených dat bude nutné chráněný objekt synchronizace, například kritické sekce.
Podrobné informace o modelu podprocesů typu apartment, naleznete v tématu procesů a podprocesů v OLE Programmer's Reference.
Proč podporovat Threading Apartment Model?
V kontejneru s více podprocesy aplikací, které také podporují apartment model lze ovládací prvky, které podporují model Apartment, typ podprocesu.Pokud nepovolíte threading apartment model, omezí potenciální sada nádob, ve kterých nelze použít ovládací prvek.
Povolení modelu Apartment, typ podprocesu je snadné většinu ovládacích prvků, zejména v případě, že mají malou nebo žádnou sdílená data.
Ochrana sdílených dat
Pokud ovládací prvek používá sdílených dat, například statické členské proměnné, přístup k data by měla být chráněna s kritický oddíl zabránit úpravou dat současně více než jeden podproces.Chcete-li nastavit kritické sekce pro tento účel, deklarovat proměnnou statický člen třídy CCriticalSection třídy ovládacího prvku.Použití Lock a Unlock funkce členů této důležité části objektu kdykoli kódu přistupuje ke sdíleným datům.
Zvažte například ovládací prvek třídy, která potřebuje udržovat řetězec, který sdílí všechny instance.Tento řetězec můžete udržovat v statickou členské proměnné a chráněn kritický oddíl.Deklarace třídy ovládacího prvku by obsahovat:
class CSampleCtrl : public COleControl
{
...
static CString _strShared;
static CCriticalSection _critSect;
};
Implementace třídy zahrnuje definice těchto proměnných:
int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect;
Přístup _strShared statický člen pak může být chráněna kritický oddíl:
void CSampleCtrl::SomeMethod()
{
_critSect.Lock();
if (_strShared.Empty())
_strShared = "<text>";
_critSect.Unlock();
...
}
Registrace Apartment vědomi pro Model řízení
Ovládací prvky, které podporují model Apartment, typ podprocesu uvádět tuto funkci v registru, přidáním pojmenovanou hodnotu "ThreadingModel" s hodnotou "Byt" v jejich třídy ID registru položku id třídy\InprocServer32 klíč.Chcete-li tento klíč k registraci automaticky u ovládacího prvku, předat afxRegApartmentThreading příznak v šestém parametr 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);
}
Pokud byl vygenerován řízení projektu ControlWizard v aplikaci Visual C++ verze 4.1 nebo novější, tento příznak již bude v kódu.Žádné změny jsou nezbytné k registraci model podprocesů.
Pokud projektu byl vytvořen v dřívější verzi ControlWizard, existující kód bude mít booleovskou hodnotu jako parametr šestého.Pokud existující parametr je TRUE, změnit na afxRegInsertable | afxRegApartmentThreading.Pokud parametr existující hodnotu FALSE, změnit na afxRegApartmentThreading.
Pokud vaši kontrolu podle pravidel pro model Apartment, typ podprocesu, se nesmí procházet afxRegApartmentThreading v tomto parametru.