TN064: model wątkowości typu apartment w formantach ActiveX
[!UWAGA]
Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.
Ta uwaga techniczna wyjaśniono, jak włączyć apartment model threading formantu ActiveX.Należy zauważyć, że apartment model threading jest obsługiwane tylko w wersjach języka Visual C++ 4.2 lub nowszym.
Co to jest Apartment Model Threading?
Komórkowy model jest podejście do obsługi obiektów osadzonych, takich jak formanty ActiveX, w ramach aplikacji wielowątkowych kontenera.Mimo że aplikacja może mieć wiele wątków, każde wystąpienie osadzonego obiektu zostanie przypisany do jednego "mieszkanie," który będzie wykonywał na tylko jeden wątek.Innymi słowy wszystkie połączenia do wystąpienia formantu nastąpi w tym samym wątku.
Jednakże innego wystąpienia tego samego rodzaju kontroli może być przypisana do innego mieszkania.Tak Jeśli wiele wystąpień formantu udostępnić wszystkie dane w wspólnego (na przykład danych statycznych lub globalne), dostęp do tych danych udostępnionych będzie konieczne ma być chroniony przez obiekt synchronizacji, na przykład sekcji krytycznej.
Aby uzyskać szczegółowe informacje o modelu wątków, zobacz procesy i wątki w OLE Programmer's Reference.
Dlaczego obsługuje Apartment Model Threading?
Formanty obsługujące apartment model threading mogą być używane w aplikacjach wielowątkowych kontenera, obsługujące model komórkowy.Jeśli nie zostanie włączona, apartment model threading, powoduje ograniczenie potencjalnych zestaw pojemników, w których może zostać wykorzystana pilota.
Włączanie komórkowy model wątkowości jest proste dla większości formantów, szczególnie, jeśli mają niewielki lub żaden udostępnionych danych.
Ochrona danych udostępnionych
Jeśli formant używa udostępnionych danych, takich jak zmienna członka statycznego, dostęp do że dane powinny być chronione z sekcji krytycznej, aby zapobiec modyfikowanie danych w tym samym czasie więcej niż jeden wątek.Aby skonfigurować sekcji krytycznej w tym celu, przy deklarowaniu zmiennej członka statycznego klasy CCriticalSection w klasie z kontroli.Użycie Lock i Unlock funkcje składowe tej sekcji krytycznej obiekt wszędzie tam, gdzie kod uzyskuje dostęp do danych udostępnionych.
Na przykład, należy rozważyć klasy kontroli, która musi być ciąg, który jest współużytkowany przez wszystkie wystąpienia.Ten ciąg może być utrzymywane w zmiennej członka statycznego i chronione przez sekcji krytycznej.Deklaracja klasy formantu może zawierać następujące dane:
class CSampleCtrl : public COleControl
{
...
static CString _strShared;
static CCriticalSection _critSect;
};
Implementacji dla klasy obejmowałyby definicje dla tych zmiennych:
int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect;
Dostęp do _strShared członka statycznego mogą być chronione przez sekcję krytyczną:
void CSampleCtrl::SomeMethod()
{
_critSect.Lock();
if (_strShared.Empty())
_strShared = "<text>";
_critSect.Unlock();
...
}
Rejestrowanie formantu apartament Model-Aware
Formantów, które obsługują apartment model threading powinna wskazywać tę funkcję w rejestrze, dodając wartość nazwanego "ThreadingModel" o wartości "Apartament" w ich klasy ID wpisu rejestru Identyfikator klasy\InprocServer32 klucz.Aby spowodować, że ten klucz ma być automatycznie rejestrowana dla pilota, przekazać afxRegApartmentThreading flagi w parametrze szósty do 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);
}
Jeśli Twój projekt kontroli został wygenerowany przez ControlWizard w programie Visual C++ w wersji 4.1 lub nowszej, ta flaga już będzie obecny w kodzie.Żadne zmiany nie są niezbędne do rejestracji model wątka.
Projekt został wygenerowany za pomocą starszej wersji ControlWizard, istniejący kod ma wartość logiczną jako parametr szóstego.Jeśli istniejący parametr ma wartość TRUE, to aby zmienić afxRegInsertable | afxRegApartmentThreading.Jeśli istniejący parametr ma wartość FALSE, to aby zmienić afxRegApartmentThreading.
Jeśli formant nie zgodne z regułami dotyczącymi komórkowy model wątkowości, nie musi upłynąć afxRegApartmentThreading w tym parametrze.