TN064: Apartment-Model wątków w formantach ActiveX
[!UWAGA]
Następujące Uwaga techniczna została zaktualizowana, ponieważ najpierw została uwzględniona w dokumentacji online.W rezultacie niektóre procedur i tematów może być nieaktualne lub nieprawidłowe.Najnowsze informacje zaleca się wyszukać temat zainteresowanie Indeks dokumentacji online.
Ten Uwaga techniczna wyjaśniono, jak włączyć apartment model threading formantu ActiveX.Należy zauważyć, że apartment model threading jest obsługiwany tylko w wersji Visual C++ 4.2 lub nowszej.
Co to jest Apartment Model Threading?
Komórkowy model jest podejście wspieraniu obiektów osadzonych, takich jak formanty ActiveX, aplikacji wielowątkowych kontenera.Mimo, że aplikacja może mieć wiele wątków, każde wystąpienie osadzonego obiektu zostanie przypisany do jednego "mieszkania,", który będzie wykonywał tylko jednego wątku.Innymi słowy wszystkie wywołania do wystąpienia formantu nastąpi w tym samym wątku.
Jednakże różnych wystąpień tego samego typu formantu może być przypisana do różnych apartamenty.Tak Jeśli wiele wystąpień formantu udostępnić wszelkie dane wspólne (na przykład danych statycznych lub globalne), dostęp do udostępnionych będzie muszą być chronione przez obiekt synchronizacji, takich jak sekcji krytycznej.
Pełne informacje na apartment threading model, zobacz procesy i wątki w OLE Programmer's Reference.
Dlaczego obsługuje Apartment Model Threading?
Formanty, które obsługują apartment model threading mogą używane w aplikacjach wielowątkowych kontenera, obsługujących komórkowy model.Jeśli apartment model threading nie jest włączona, powoduje ograniczenie potencjalnych zestaw pojemnikach, w których można użyć formantu.
Włączanie komórkowy model wątków jest łatwo większość formantów, szczególnie, jeżeli posiadają niewielki lub udostępnionych danych.
Ochrona danych udostępnionych
Jeśli formant używa udostępnionych danych, takich jak zmienna członka statycznego, dostęp do dane powinny być chronione w sekcji krytycznej, aby zapobiec modyfikowanie danych w tym samym czasie więcej niż jeden wątek.Aby skonfigurować sekcję krytyczną w tym celu, należy zadeklarować zmienną członka statycznego klasy CCriticalSection w klasie Jeśli formant.Użyj Lock i Unlock funkcji elementów członkowskich w tej sekcji krytycznej obiektów w każdym miejscu kodu uzyskuje dostęp do udostępnionych danych.
Na przykład rozważyć klasy control, który musi być współużytkowana przez wszystkie wystąpienia ciągu.Ten ciąg może utrzymać w zmiennej członka statycznego i chronione sekcji krytycznej.Deklaracja klasy formantu będzie zawierać:
class CSampleCtrl : public COleControl
{
...
static CString _strShared;
static CCriticalSection _critSect;
};
Implementacji klasy obejmuje definicje dla tych zmiennych:
int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect;
Dostęp do _strShared członka statycznego następnie mogą być chronione przez sekcję krytyczną:
void CSampleCtrl::SomeMethod()
{
_critSect.Lock();
if (_strShared.Empty())
_strShared = "<text>";
_critSect.Unlock();
...
}
Rejestrowanie komórkowy Model rozpoznają kontroli
Formanty, które obsługują apartment model threading powinien wskazywać tę funkcję w rejestrze, dodając wartość nazwanego "ThreadingModel" o wartości "Apartament" w ich wpisu rejestru identyfikator klasy, w obszarze identyfikator klasy\InprocServer32 klucza.Aby spowodować, że ten klucz, aby być automatycznie rejestrowane dla formantu, należy przekazać afxRegApartmentThreading w szóstym parametr flagę 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);
}
Formant projektu został wygenerowany przez ControlWizard w programie Visual C++ w wersji 4.1 lub nowszą, ta flaga już będzie obecna w kodzie.Zmiany nie są konieczne do model wątka rejestrowania.
Jeśli projekt został wygenerowany przez wcześniejszą wersję ControlWizard, istniejący kod będzie wartość logiczną jako parametr szóstego.Jeśli istniejący parametr ma wartość PRAWDA, zmień go na afxRegInsertable | afxRegApartmentThreading.Jeśli istniejący parametr ma wartość FAŁSZ, zmień go na afxRegApartmentThreading.
Jeśli formant nie należy przestrzegać reguł dotyczących komórkowy model wątków, nie trzeba przekazywać afxRegApartmentThreading w tym parametrze.