Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Tek iş parçacıklı daireleri (daire modeli işlemi) kullanmak, eşzamanlı olarak çalışan birden çok nesneyle ilgilenmek için ileti tabanlı bir paradigma sunar. Başka bir iş parçacığının yürütülmesini sağlamak için zaman alan bir işlemin tamamlanmasını beklerken bir iş parçacığına izin vererek daha verimli kod yazmanızı sağlar.
Bir apartman modeli işlemi olarak başlatılan ve pencere iletilerini alan ve dağıtan bir işlemdeki her iş parçacığı, tek iş parçacıklı bir daire iş parçacığıdır. Her iplik kendi dairesi içinde yaşar. Bir daire içinde, arabirim işaretçileri hazırlama olmadan geçirilebilir ve bu nedenle, tek iş parçacıklı bir daire iş parçacığındaki tüm nesneler doğrudan iletişim kurar.
Tümü aynı iş parçacığında yürütülen ve bu nedenle zaman uyumlu yürütmeye sahip olması gereken ilişkili nesnelerin mantıksal gruplandırması, aynı tek iş parçacıklı daire iş parçacığında yaşayabilir. Ancak, bir daire modeli nesnesi birden fazla iş parçacığında bulunamaz. Diğer iş parçacıklarındaki nesnelere çağrılar, sahip olan iş parçacığı bağlamında yapılmalıdır, bu nedenle dağıtılmış COM bir ara sunucuyu çağırdığınızda iş parçacıklarını sizin için otomatik olarak değiştirir.
İşlemler arası ve iş parçacıklı modeller benzerdir. Aynı işlem içinde bir arabirim işaretçisini başka bir apartmandaki bir nesneye (başka bir iş parçacığında) geçirmek gerektiğinde, farklı işlemlerdeki nesnelerin işaretçileri işlem sınırları arasında geçirmek için kullandığı aynı sıralama modelini kullanırsınız. Standart sıralama nesnesine bir işaretçi alarak, arabirim işaretçilerini işlemler arasında yaptığınız gibi iş parçacığı sınırları (daireler arasında) arasında sıralayabilirsiniz. (Arabirim işaretçileri daireler arasında geçirildiğinde sıralanmalıdır.)
Tek iş parçacıklı daireler için kurallar basittir, ancak bunları dikkatle izlemek önemlidir:
- Her nesne yalnızca bir iş parçacığında (tek iş parçacıklı bir dairede) yaşamalıdır.
- Her iş parçacığı için COM kitaplığını başlatın.
- Tüm işaretçileri daireler arasında geçirirken nesnelere göre sırala.
- Tek iş parçacıklı her dairenin, aynı işlem içindeki diğer işlemlerden ve dairelerden gelen çağrıları işlemek için bir ileti döngüsü olmalıdır. Nesneleri olmayan tek iş parçacıklı daireler (yalnızca istemci) ayrıca bazı uygulamaların kullandığı yayın iletilerini göndermek için bir ileti döngüsüne de ihtiyaç duyar.
- DLL tabanlı veya işlem içi nesneler COM başlatma işlevlerini çağırmaz; bunun yerine, iş parçacığı modelini kayıt defterindeki InprocServer32 anahtarı altında ThreadingModel named-value ile kaydederler. Daireye duyarlı nesneler de DLL giriş noktalarını dikkatli bir şekilde yazmalıdır. İşlem içi sunucularda iş parçacığı oluşturma için dikkat edilmesi gereken özel noktalar vardır. Daha fazla bilgi için bkz. In-Process Sunucu İş Parçacığı Oluşturma Sorunları.
Birden çok nesne tek bir iş parçacığında yaşayabilse de, hiçbir apartman modeli nesnesi birden fazla iş parçacığında yaşayamaz.
İstemci işleminin veya işlem dışı sunucunun her iş parçacığı CoInitializeçağrısı yapmalı veya CoInitializeEx çağırıp dwCoInit parametresi için COINIT_APARTMENTTHREADED belirtmelidir. Ana daire, önce CoInitializeEx çağıran iş parçacığıdır. İşlem içi sunucular hakkında bilgi için bkz. In-Process Sunucu İş Parçacığı Oluşturma Sorunları.
Bir nesneye yapılan tüm çağrılar iş parçacığında (kendi dairesi içinde) yapılmalıdır. Bir nesneyi doğrudan başka bir iş parçacığından çağırmak yasaktır; nesneleri bu serbest iş parçacıklı şekilde kullanmak, uygulamalarda sorunlara neden olabilir. Bu kuralın etkisi, nesnelere yönelik tüm işaretçilerin daireler arasında geçirildiğinde sıralanması gerektiğidir. COM bu amaçla aşağıdaki iki işlevi sağlar:
- CoMarshalInterThreadInterfaceInStream bir arabirimi çağırana döndürülen bir akış nesnesine sıralar.
- CoGetInterfaceAndReleaseStream bir arabirim işaretçisini akış nesnesinden kaldırır ve serbest bırakır.
Bu işlevler çağrıları CoMarshalInterface ve MSHCTX_INPROC bayrağının kullanılmasını gerektiren CoUnmarshalInterfaceişlevlerinisarmalar.
Genel olarak, sıralama COM tarafından otomatik olarak gerçekleştirilir. Örneğin, bir arabirim işaretçisini bir yöntem çağrısında parametre olarak başka bir dairedeki bir nesneye bir ara sunucuya geçirirken veya cocreateInstanceçağrılırken, COM hazırlamayı otomatik olarak yapar. Ancak, uygulama yazıcısının normal COM mekanizmalarını kullanmadan daireler arasında arabirim işaretçileri ilettiği bazı özel durumlarda, yazıcının hazırlamayı el ile işlemesi gerekir.
Bir işlemdeki bir dairenin (Daire 1) arabirim işaretçisi varsa ve başka bir daire (Daire 2) kullanılmasını gerektiriyorsa, Daire 1'in arabirimi sıralamak için CoMarshalInterThreadInterfaceInStream çağırması gerekir. Bu işlev tarafından oluşturulan akış iş parçacığı açısından güvenlidir ve 2. Daire tarafından erişilebilen bir değişkende depolanmalıdır. Daire 2, arabirimin özetini açmak için bu akışı CoGetInterfaceAndReleaseStream geçirmelidir ve arabirime erişebileceği bir ara sunucu işaretçisini geri alır. İstemci tüm COM çalışmalarını tamamlayana kadar ana dairenin canlı kalması gerekir (çünkü In-Process Sunucu İş Parçacığı Oluşturma Sorunları). İş parçacıkları arasında bu şekilde bir nesne geçirildikten sonra, arabirim işaretçilerini parametre olarak geçirmek çok kolaydır. Bu şekilde, dağıtılmış COM uygulama için sıralama ve iş parçacığı geçişini yapar.
Aynı işlem içindeki diğer işlemlerden ve dairelerden gelen çağrıları işlemek için, tek iş parçacıklı her dairenin bir ileti döngüsü olmalıdır. Bu, iş parçacığının iş işlevinin GetMessage/DispatchMessage döngüsüne sahip olması gerektiği anlamına gelir. İş parçacıkları arasında iletişim kurmak için diğer eşitleme temel bilgileri kullanılıyorsa, MsgWaitForMultipleObjects işlevi hem iletileri hem de iş parçacığı eşitleme olaylarını beklemek için kullanılabilir. Bu işlevin belgelerinde bu tür bir birleşim döngüsü örneği vardır.
COM, tek iş parçacıklı her dairede "OleMainThreadWndClass" Windows sınıfını kullanarak gizli bir pencere oluşturur. Bir nesneye yapılan çağrı, bu gizli pencereye bir pencere iletisi olarak alınır. Nesnenin dairesi iletiyi alıp dağıttığında, gizli pencere alır. Pencere yordamı daha sonra nesnenin ilgili arabirim yöntemini çağırır.
Birden çok istemci bir nesneyi çağırdığında, çağrılar ileti kuyruğunda kuyruğa alınır ve dairesi iletileri her aldığında ve dağıttığında nesne bir çağrı alır. Çağrılar COM tarafından eşitlenir ve çağrılar her zaman nesnenin dairesine ait iş parçacığı tarafından teslim edildiğinden, nesnenin arabirim uygulamaları eşitleme sağlamaz. Tek iş parçacıklı daireler, gerektiğinde çağrıları iptal etmelerine veya pencere iletileri almalarına izin vermek için IMessageFilter uygulayabilir.
Arabirim yöntemi uygulamalarından biri iletileri alır ve dağıtırsa veya başka bir iş parçacığına ORPC çağrısı yaparsa, nesneye başka bir çağrının (aynı daire tarafından) teslim edilmesine neden olursa nesne yeniden eklenebilir. OLE aynı iş parçacığında yeniden giriş yapılmasını engellemez, ancak iş parçacığı güvenliğini sağlamaya yardımcı olabilir. Bu, bir ileti işlenirken iletileri alıp dağıtan bir pencere yordamının yeniden girme yöntemiyle aynıdır. Ancak, başka bir tek iş parçacıklı daire sunucusunu çağıran işlem dışı tek iş parçacıklı bir apartman sunucusu çağrılması, ilk sunucunun yeniden girişine izin verir.
İlgili konular