Çoklu İş Parçacığı Kullanımı: MFC Programlama İpuçları
Çok iş parçacıklı uygulamalar, işlemlerin istenen sırada gerçekleşmesini ve birden çok iş parçacığı tarafından erişilen verilerin bozulmamasını sağlamak için tek iş parçacıklı uygulamalardan daha sıkı bir bakım gerektirir. Bu konu başlığı altında, Microsoft Foundation Sınıf (MFC) kitaplığıyla çok iş parçacıklı uygulamaları programlama sırasında olası sorunları önlemeye yönelik teknikler açıklanmaktadır.
Birden Çok İş Parçacığından Nesnelere Erişme
MFC nesneleri kendi başlarına iş parçacığı güvenli değildir. MFC eşitleme sınıflarını ve/veya kritik bölümler gibi uygun Win32 eşitleme nesnelerini kullanmadığınız sürece iki ayrı iş parçacığı aynı nesneyi işleyemez. Kritik bölümler ve diğer ilgili nesneler hakkında daha fazla bilgi için bkz . Windows SDK'sında eşitleme .
Sınıf kitaplığı, hata ayıklama bellek ayırması tarafından kullanılanlar gibi genel veri yapılarını korumak için kritik bölümleri dahili olarak kullanır.
MFC Olmayan İş Parçacıklarından MFC Nesnelerine Erişme
CWinThread nesnesi kullanmak dışında bir şekilde iş parçacığı oluşturan çok iş parçacıklı bir uygulamanız varsa, bu iş parçacığından diğer MFC nesnelerine erişemezsiniz. Başka bir deyişle, ikincil bir iş parçacığından herhangi bir MFC nesnesine erişmek istiyorsanız, bu iş parçacığını Çok İş Parçacığı Oluşturma: Kullanıcı Arabirimi İş Parçacıkları Oluşturma veya Çok İş Parçacığı Oluşturma: Çalışan İş Parçacıkları Oluşturma bölümünde açıklanan yöntemlerden biriyle oluşturmanız gerekir. Bu yöntemler, sınıf kitaplığının çok iş parçacıklı uygulamaları işlemek için gerekli iç değişkenleri başlatmasına izin veren tek yöntemlerdir.
Windows Tanıtıcı Haritalar
Genel bir kural olarak, iş parçacığı yalnızca oluşturduğu MFC nesnelerine erişebilir. Bunun nedeni, birden çok iş parçacığından eşzamanlı erişime karşı korumanın korunmasına yardımcı olmak için geçici ve kalıcı Windows tanıtıcı eşlemelerinin iş parçacığı yerel depolama alanında tutulmasıdır. Örneğin, bir çalışan iş parçacığı hesaplama gerçekleştiremez ve sonra belgenin UpdateAllViews
üye işlevini çağırarak yeni verilerde görünüm içeren pencerelerin değiştirilmesini sağlar. Nesnelerden CWnd
HWND'lere eşleme birincil iş parçacığına yerel olduğundan bunun hiçbir etkisi yoktur. Bu, bir iş parçacığının Bir Windows tanıtıcısından C++ nesnesine eşlemesi olabileceği, ancak başka bir iş parçacığının aynı tanıtıcıyı farklı bir C++ nesnesine eşleyebileceği anlamına gelir. Bir iş parçacığında yapılan değişiklikler diğerine yansıtılmaz.
Bu sorunun çeşitli yolları vardır. İlki, C++ nesneleri yerine tek tek tanıtıcıları (HWND gibi) çalışan iş parçacığına geçirmektir. Çalışan iş parçacığı daha sonra uygun FromHandle
üye işlevini çağırarak bu nesneleri geçici eşlemesine ekler. çağırarak Attach
da nesnesini iş parçacığının kalıcı eşlemesine ekleyebilirsiniz, ancak bu yalnızca nesnenin iş parçacığından daha uzun süre var olacağı garanti edilirse yapılmalıdır.
Başka bir yöntem, çalışan iş parçacıklarınızın gerçekleştireceği farklı görevlere karşılık gelen yeni kullanıcı tanımlı iletiler oluşturmak ve kullanarak ::PostMessage
bu iletileri uygulamanın ana penceresine göndermektir. Bu iletişim yöntemi, her iki iş parçacığının da aynı adres alanında yürütülmesi dışında iki farklı uygulamanın yakınsanmasına benzer.
Haritaları işleme hakkında daha fazla bilgi için bkz . Teknik Not 3. İş parçacığı yerel depolaması hakkında daha fazla bilgi için bkz . Windows SDK'sında İş Parçacığı Yerel Depolama ve İş Parçacığı Yerel Depolama Kullanma.
İş Parçacıkları Arasında İletişim Kurma
MFC, iş parçacığı güvenliğini korumak için iş parçacıklarının nesnelere erişimi eşitlemesine olanak sağlayan bir dizi sınıf sağlar. Bu sınıfların kullanımı Çoklu İş Parçacığı Kullanımı: Eşitleme Sınıflarını Kullanma ve Çoklu İş Parçacığı Kullanımı: Eşitleme Sınıfları Ne Zaman Kullanılır? başlığı altında açıklanmıştır. Bu nesneler hakkında daha fazla bilgi için bkz . Windows SDK'sında eşitleme .