TN064: ActiveX Denetimlerinde Durum Modeli İş Parçacığı Oluşturma
Dekont
Aşağıdaki teknik not, çevrimiçi belgelere ilk kez eklendiğinden beri güncelleştirilmemiştir. Sonuç olarak, bazı yordamlar ve konular güncel olmayabilir veya yanlış olabilir. En son bilgiler için, çevrimiçi belge dizininde ilgilendiğiniz konuyu aramanız önerilir.
Bu teknik notta, bir ActiveX denetiminde apartman modeli iş parçacığı oluşturmayı etkinleştirme açıklanmaktadır. Daire modeli iş parçacığı oluşturmanın yalnızca Visual C++ 4.2 veya sonraki sürümlerinde desteklendiğini unutmayın.
Apartman Modeli İş Parçacığı Oluşturma Nedir?
Daire modeli, çok iş parçacıklı bir kapsayıcı uygulamasında ActiveX denetimleri gibi katıştırılmış nesneleri desteklemeye yönelik bir yaklaşımdır. Uygulamanın birden çok iş parçacığı olsa da, katıştırılmış nesnenin her örneği tek bir iş parçacığında yürütülecek bir "daireye" atanır. Başka bir deyişle, bir denetimin örneğine yapılan tüm çağrılar aynı iş parçacığında gerçekleşir.
Ancak, aynı denetim türünün farklı örnekleri farklı dairelere atanabilir. Bu nedenle, bir denetimin birden çok örneği ortak verileri paylaşıyorsa (örneğin, statik veya genel veriler), bu paylaşılan verilere erişimin kritik bir bölüm gibi bir eşitleme nesnesi tarafından korunması gerekir.
Daire iş parçacığı oluşturma modeliyle ilgili tüm ayrıntılar için lütfen OLE Programcı Başvurusu'ndaki İşlemler ve İş Parçacıkları bölümüne bakın.
Neden Apartman Modeli İş Parçacığı Oluşturma Desteği
Apartman modeli iş parçacığını destekleyen denetimler, apartman modelini de destekleyen çok iş parçacıklı kapsayıcı uygulamalarında kullanılabilir. Apartman modeli iş parçacığı oluşturmayı etkinleştirmezseniz, denetiminizin kullanılabilmesi için olası kapsayıcı kümesini sınırlandırırsınız.
Özellikle çok az paylaşılan verisi varsa veya hiç veri yoksa, çoğu denetim için daire modeli iş parçacığı oluşturma özelliğini etkinleştirmek kolaydır.
Paylaşılan Verileri Koruma
Denetiminiz statik üye değişkeni gibi paylaşılan veriler kullanıyorsa, birden fazla iş parçacığının verileri aynı anda değiştirmesini önlemek için bu verilere erişim kritik bir bölümle korunmalıdır. Bu amaçla kritik bir bölüm ayarlamak için, denetiminizin sınıfında sınıfının CCriticalSection
statik üye değişkenini bildirin. Kodunuzun Lock
paylaşılan verilere eriştiği her yerde bu kritik bölüm nesnesinin ve Unlock
üye işlevlerini kullanın.
Örneğin, tüm örnekler tarafından paylaşılan bir dizeyi koruması gereken bir denetim sınıfını düşünün. Bu dize statik üye değişkeninde tutulabilir ve kritik bir bölüm tarafından korunabilir. Denetimin sınıf bildirimi aşağıdakileri içerebilir:
class CSampleCtrl : public COleControl
{
...
static CString _strShared;
static CCriticalSection _critSect;
};
sınıfı için uygulama şu değişkenler için tanımları içerebilir:
int CString CSampleCtrl::_strShared;
CCriticalSection CSampleCtrl::_critSect;
Statik üyeye _strShared
erişim daha sonra kritik bölüm tarafından korunabilir:
void CSampleCtrl::SomeMethod()
{
_critSect.Lock();
if (_strShared.Empty())
_strShared = "<text>";
_critSect.Unlock();
...
}
Bir Apartman Modeli Kullanan Denetimi Kaydetme
Apartman modeli iş parçacığı oluşturmayı destekleyen denetimler, sınıf kimliği\InprocServer32 anahtarının altına sınıf kimliği kayıt defteri girişinde "Apartment" değerine sahip adlandırılmış değeri "ThreadingModel" ekleyerek kayıt defterinde bu özelliği göstermelidir. Bu anahtarın denetiminiz için otomatik olarak kaydedilmesine neden olmak için altıncı parametredeki afxRegApartmentThreading bayrağını öğesine AfxOleRegisterControlClass
geçirin:
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);
}
Denetim projeniz Visual C++ sürüm 4.1 veya sonraki bir sürümde ControlWizard tarafından oluşturulduysa, bu bayrak kodunuzda zaten bulunur. İş parçacığı modelini kaydetmek için değişiklik yapılması gerekmez.
Projeniz ControlWizard'ın önceki bir sürümü tarafından oluşturulduysa, var olan kodunuz altıncı parametre olarak boole değerine sahip olur. Mevcut parametre TRUE ise, afxRegInsertable | afxRegApartmentThreading olarak değiştirin. Mevcut parametre FALSE ise afxRegApartmentThreading olarak değiştirin.
Denetiminiz apartman modeli iş parçacığı oluşturma kurallarına uymuyorsa, bu parametrede afxRegApartmentThreading geçirmemelisiniz.