TN064: Model apartment práce s vlákny v ovládacích prvcích ActiveX
[!POZNÁMKA]
Následující technická poznámka nebyla aktualizována, protože byla poprvé zahrnuta v dokumentaci online.V důsledku toho některé postupy a témata mohou být nesprávné nebo zastaralé.Pro nejnovější informace je vhodné vyhledat téma zájmu v dokumentaci online index.
Tato technická Poznámka vysvětluje, jak povolit apartment model podprocesů v ovládacím prvku ActiveX.Všimněte si, že threading apartment model je podporována pouze ve verzi Visual C++ 4.2 nebo novější.
Co je to Threading Apartment Model?
Apartment model je přístup k podpůrné vložené objekty, například ovládací prvky ActiveX v aplikaci s více vlákny kontejneru.Přestože aplikace může mít více vláken, každou instanci vloženého objektu budou přiřazeny k jedné "byt", který bude proveden pouze jedním podprocesem.Jinými slovy všechny hovory do instance ovládacího prvku dojde ve stejném podprocesu.
Různých instancích stejného typu ovládacího prvku, může být přiřazen k jiné byty.Proto pokud více instancí ovládacího prvku sdílejí data do společného (například statické a globální data), pak přístupu k těmto sdíleným datům třeba chráněny synchronizaci objektů, jako jsou například kritické sekce.
Podrobné informace o modelu podprocesů typu apartment, viz procesů a podprocesů v OLE Programmer's Reference.
Proč podporovat Threading Apartment Model?
Ovládací prvky, které podporují apartment model podprocesů lze v kontejneru s více podprocesy aplikací, které podporují také apartment model.Pokud nepovolíte threading apartment model, omezí potenciální sada nádob, ve kterých lze použít ovládací prvek.
Povolení threading apartment model je snadné pro 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 váš ovládací prvek používá sdílených dat, například statické členské proměnné, přístup k že údaje by měly být chráněny s kritická sekce zabránit úpravou dat současně více než jeden podproces.Nastavit kritické sekce pro tento účel, deklarovat proměnnou statického člena třídy CCriticalSection ve třídě ovládacího prvku.Použití Lock a Odemknout členské funkce této důležité části objektu, pokud váš kód přistupuje ke sdíleným datům.
Zvažte například třídu ovládacího prvku, který je potřeba udržovat řetězce, které jsou sdíleny všechny instance.Tento řetězec lze udržují ve statické členské proměnné a chráněna kritická sekce.Deklarace třídy ovládacího prvku by obsahovat:
class CSampleCtrl : public COleControl
{
...
static CString _strShared;
static CCriticalSection _critSect;
};
Implementace třídy by obsahovat definice pro tyto proměnné:
int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect;
Přístup _strShared statický člen pak může být chráněna kritická sekce:
void CSampleCtrl::SomeMethod()
{
_critSect.Lock();
if (_strShared.Empty())
_strShared = "<text>";
_critSect.Unlock();
...
}
Registrace ovládacího prvku typu Apartment-Model Aware
Ovládací prvky, které podporují apartment model podprocesů uvádět tuto funkci v registru, přidáním pojmenovanou hodnotu "ThreadingModel" s hodnotou "Byt" ve své třídě ID položky registru id třídy\InprocServer32 klíč.Chcete-li tento klíč k automatické registraci ovládacího prvku způsobí, afxRegApartmentThreading příznak v šestý 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 váš projekt správy byla generována pomocí ControlWizard v aplikaci Visual C++ verze 4.1 nebo vyšší, tento příznak již bude k dispozici ve vašem kódu.Žádné změny jsou nutné k registraci model podprocesů.
Pokud váš projekt byl vytvořen ve starší verzi ControlWizard, existující kód bude mít logickou hodnotu jako šestý parametr.Pokud existující parametr je TRUE, změnit tak, aby afxRegInsertable | afxRegApartmentThreading.Pokud existující parametr je FALSE, změňte jej na afxRegApartmentThreading.
Pokud váš ovládací prvek nedodržuje pravidla pro threading apartment model, nesmí procházet afxRegApartmentThreading v tomto parametru.