TN064: Apartment-Model wątków w formantów ActiveX

Ta Uwaga techniczna objaśnia sposób włączania, Apartament modelu wątków w formancie ActiveX. Należy zauważyć, że apartament modelu wątków jest tylko obsługiwane w wersji Visual C++ 4.2 lub nowszej.

Co to jest Model Apartament wątków?

Komórkowy model jest podejście do obsługi obiektów osadzonych, takich jak formanty ActiveX, aplikacji wielowątkowych kontenera. Chociaż zastosowanie mogą mieć wiele wątków, każde wystąpienie obiektu osadzonego zostanie przypisany do jednego "mieszkania," który będzie wykonywał na tylko jeden wątek. Innymi słowy wszystkie wywołania instancję formantu nastąpi w tym samym wątku.

Jednakże inne wystąpienia tego samego rodzaju kontroli może być przydzielony różnych apartamenty. Tak jeśli wiele wystąpień formantu udostępniać dowolne dane wspólnego (na przykład dane statyczne lub globalne), następnie dostęp do współużytkowanych danych będą musiały być chronione za pomocą obiektu synchronizacji, takich jak sekcji krytycznej.

Aby uzyskać pełne informacje o apartment threading modelu, zobacz procesów i wątków w OLE Programmer's Reference.

Dlaczego obsługuje Model Apartament wątków?

Formanty, które obsługują model Apartament wątków może służyć w aplikacjach wielowątkowych kontenera, które obsługują także modelu komórkowym. Jeśli nie zostanie włączona, Apartament modelu wątków, będzie ograniczenie potencjalnych zestaw pojemników, w które można formantu.

Włączanie, Apartament modelu wątków jest łatwo większość formantów, szczególnie, jeżeli posiadają niewielki lub żaden udostępnionych danych.

Ochrona danych udostępnionych

Jeśli Twój control korzysta z udostępnionych danych, takich jak zmienna członka statycznego, dostęp do że dane powinny być chronione w sekcji krytycznej zapobiegające więcej niż jeden wątek na modyfikowanie danych w tym samym czasie. Aby skonfigurować sekcję krytyczną dla tego celu, Zadeklaruj zmienną członka statycznego klasy CCriticalSection w klasie z kontroli. Użyć funkcji elementów członkowskich zablokowania i odblokowania tego obiektu sekcji krytycznej, wszędzie tam, gdzie Twój kod uzyskuje dostęp do współużytkowanych danych.

Na przykład rozważyć klasy kontroli, która musi być ciągiem, który jest współużytkowany przez wszystkie wystąpienia. Ten ciąg może utrzymać w zmiennej członka statycznego i chronione przez sekcję krytyczną. Deklaracji klasy formantu będzie zawierać następujące:

klasa CSampleCtrl: COleCo&ntrol publicznych
{
 nbsp;  ...
    statyczne CString _strShared;
    statyczne CCriticalSection _critSect;
}

Wdrożenie dla klasy obejmowałyby 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()
{
 nbsp;  _critSect.Lock();
    Jeżeli (_strShared.Empty())
        _strShared = "<text>";
    _critSect.Unlock();
    ...
}

Rejestrowanie formantu Apartament Model-Aware

Formanty, które obsługują model Apartament wątków powinien wskazywać tę funkcję w rejestrze, dodając wartość o nazwie „ThreadingModel"z wartością „Apartament" w ich wpisu rejestru identyfikator klasy na identyfikator klasy\InprocServer32 klucza. Spowodować ten klucz automatycznie zarejestrowany dla formantu, przekazać afxRegApartmentThreading Flaga w szóstym parametr AfxOleRegisterControlClass:

BOOL CSampleCtrl::CSampleCtrlFactory::UpdateRegistry(BOOL bRegister)
{
    Jeżeli (bZarejestruj)
        Zwraca AfxOleRegisterControlClass (
            AfxGetInstanceHandle(),
            m_clsid,
            m_lpszProgID,
            IDS_SAMPLE,
            IDB_SAMPLE,
            afxRegApartmentThreading,
            _dwSampleOleMisc,
            _tlid,
            _wVerMajor,
            _wVerMinor);
    Else
        Zwraca AfxOleUnregisterClass (m_clsid, m_lpszProgID);
}

Jeśli projekt kontroli został wygenerowany przez ControlWizard w programie Visual C++ w wersji 4.1 lub nowszej, ta flaga już będzie obecna w kodzie. Zmiany nie są konieczne zarejestrować model wątka.

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ść TRUE, zmień go na afxRegInsertable | afxRegApartmentThreading . Jeśli istniejący parametr ma wartość FALSE, zmień go do afxRegApartmentThreading.

Jeśli formantu nie stosują się do zasad dla Apartament modelu wątków, muszą nie przechodzą afxRegApartmentThreading w tym parametrze.

Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii

Index