Aracılığıyla paylaş


TN064: Apartman ActiveX denetimleri iş parçacığı oluşturma modeli

[!NOT]

İlk çevrimiçi belgelerinde yer almıştır beri aşağıdaki teknik Not güncelleştirilmedi.Sonuç olarak bazı yordamlar ve konuları eski veya yanlış.En son bilgiler için çevrimiçi belgelere dizini ilgilendiğiniz konu aramak önerilir.

Bu teknik notu, iş parçacığı apartman modeli bir ActiveX denetimi etkinleştirmek açıklar.İş parçacığı modeli Apartman yalnızca Visual C++ sürüm 4.2 veya sonraki bir sürümü desteklenir.

İş parçacığı modeli Apartman nedir?

Grup modeli, çok iş parçacıklı konteyner uygulaması içinde ActiveX denetimleri gibi katıştırılmış nesneleri destekleyen bir yaklaşımdır.Uygulama, birden çok iş parçacığı olabilir, ancak her katıştırılmış bir nesne örneği "tek bir iş parçacığında yürütecek bir grup," atanacaktır.Diğer bir deyişle, bir denetimin örneğini yapılan tüm çağrıların iş parçacığında gerçekleşecektir.

Ancak, farklı örnekleri aynı tür bir denetim için farklı işi atanabilir.Birden çok örneğini Denetim verileri (örneğin, statik veya genel veri) ortak paylaşıyorsanız, bu nedenle, ardından bu paylaşılan verilere erişimi önemli bir bölümü gibi bir eşitleme nesnesi tarafından korunan gerekecektir.

Modeli ile ilgili tüm ayrıntılar için lütfen bkz: işlemleri ve iş parçacıklarını , ole Programmer's Reference.

Neden destek modeli Apartman iş parçacığı?

İş parçacığı modeli Apartman desteği denetimleri Grup modeli destekleyen çok iş parçacıklı kapsayıcı uygulamalarında kullanılabilir.İş parçacığı modeli Apartman etkinleştirmezseniz, denetimi kullanılabilir kapsayıcılar olası kümesini sınırlar.

İş parçacığı modeli Apartman etkinleştirilmesi özellikle çok az veya hiç paylaşılan veri varsa çoğu denetimler için kolaydır.

Paylaşılan veri koruma

Paylaşılan veri denetimi kullanırsa gibi statik bir üye değişkeni, verileri birden çok iş parçacığı aynı anda verileri değiştirmesini engellemek için önemli bir bölümü ile korunması erişim.Bu amaca yönelik önemli bir bölümünü ayarlamak için sınıfının durağan üye değişkeni bildirmek CCriticalSection , denetimin sınıfında.Use Lock ve Unlock bu kritik bölüm işlevlerin üye nesne kodunuzu Paylaşılan verilere erişen her yerde.

Örneğin, tüm örnekleri tarafından paylaşılan bir dize korumak için gereken denetim sınıfı'ı düşünün.Bu dize, statik üyesine bir değişkende saklanır ve önemli bir bölümü tarafından korunan.Denetimin sınıf bildirimi aşağıdakileri içerecektir:

class CSampleCtrl : public COleControl
{
    ...
    static CString _strShared;
    static CCriticalSection _critSect;
};

Uygulama sınıfı için bu değişkenlerin tanımları içerir:

int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect;

Erişim _strShared statik üyesi tarafından kritik bölüm sonra korunabilir:

void CSampleCtrl::SomeMethod()
{
    _critSect.Lock();
    if (_strShared.Empty())
        _strShared = "<text>";
    _critSect.Unlock();
    ...
}

Grup modeli uyumlu bir denetim kaydı

İş parçacığı modeli Apartman desteği denetimleri belirtmek bu yeteneği kayıt defterindeki "ThreadingModel" adlandırılmış değeri ekleyerek "Apartman" değerinin altında sınıf kimliği kayıt defteri girdisi de sınıf kimliği\Inprocserver32 anahtar.Denetimi için otomatik olarak kaydedilmesi için bu anahtarı neden aktarmak afxRegApartmentThreading altıncı parametresinde bayrak 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);
}

Bu bayrak zaten denetim projenizi Visual C++ sürüm 4.1 veya daha sonra ControlWizard tarafından üretilen, kodunuzda bulunacaktır.İş parçacığı modelini kaydetmek hiçbir değişiklik gereklidir.

Projenizi ControlWizard önceki bir sürümünde oluşturulmuşsa, varolan kodunuzu altıncı parametresi olarak bir Boole değeri olacaktır.Varolan parametresi true ise değiştirmek afxRegInsertable | afxRegApartmentThreading.Varolan parametre false ise, değiştirmek afxRegApartmentThreading.

Denetimi için iş parçacığı modeli Apartman kurallarına değil, sizin değil geçmesi gereken afxRegApartmentThreading Bu parametrede.

Ayrıca bkz.

Diğer Kaynaklar

Teknik notlar numarasına göre

Kategoriye göre teknik notlar