Windows Yuvaları: Engelleme
Bu makale ve iki yardımcı makale, Windows Yuvaları programlamadaki çeşitli sorunları açıklar. Bu makale engellemeyi kapsar. Diğer sorunlar şu makalelerde ele alınmıştır: Windows Yuvaları: Bayt Sıralama ve Windows Yuvaları: Dizeleri Dönüştürme.
CAsyncSocket sınıfını kullanıyor veya sınıfından türetilirseniz, bu sorunları kendiniz yönetmeniz gerekir. CSocket sınıfını kullanır veya bu sınıftan türetilirseniz, MFC bunları sizin için yönetir.
Engelleme
Bir yuva "engelleme modunda" veya "engellemesiz modda" olabilir. Engelleme (veya zaman uyumlu) modundaki yuvaların işlevleri, eylemlerini tamamlayıncaya kadar geri dönmez. İşlevi çağrılan yuva hiçbir şey yapamayacağından ( çağrı dönene kadar) engellendiğinden, bu engelleme olarak adlandırılır. Örneğin, üye işlevine Receive
yapılan bir çağrının tamamlanması, gönderen uygulamanın göndermesini beklediğinden (bunu kullanıyorsanız CSocket
veya engelleme ile kullanıyorsanız CAsyncSocket
) tamamlanması rastgele uzun sürebilir. Bir CAsyncSocket
nesne engellemesiz moddaysa (zaman uyumsuz olarak çalışıyor), çağrı hemen döndürür ve GetLastError üye işleviyle alınabilen geçerli hata kodu WSAEWOULDBLOCK olur ve çağrının mod nedeniyle hemen döndürülmemesi durumunda engellendiğini gösterir. (CSocket
hiçbir zaman WSAEWOULDBLOCK döndürmez. sınıfı sizin için engellemeyi yönetir.)
Yuvaların davranışı, 32 bit ve 64 bit işletim sistemlerinin (Windows 95 veya Windows 98 gibi) altında 16 bit işletim sistemlerinden (Windows 3.1 gibi) farklıdır. 16 bit işletim sistemlerinden farklı olarak, 32 bit ve 64 bit işletim sistemleri preemptive multitasking kullanır ve çoklu iş parçacığı kullanımı sağlar. 32 bit ve 64 bit işletim sistemlerinin altında yuvalarınızı ayrı çalışan iş parçacıklarına yerleştirebilirsiniz. İş parçacığındaki bir yuva, uygulamanızdaki diğer etkinliklere müdahale etmeden ve engellemeye işlem zamanı harcamadan engelleyebilir. Çok iş parçacıklı programlama hakkında bilgi için Çoklu iş parçacığı kullanımı makalesine bakın.
Dekont
Çok iş parçacıklı uygulamalarda, kullanıcı arabiriminin yanıt hızını etkilemeden programınızın tasarımını basitleştirmek için engelleme özelliğini CSocket
kullanabilirsiniz. Ana iş parçacığındaki kullanıcı etkileşimlerini işleyerek ve CSocket
alternatif iş parçacıklarında işleyerek, bu mantıksal işlemleri ayırabilirsiniz. Çok iş parçacıklı olmayan bir uygulamada, bu iki etkinliğin tek bir iş parçacığı olarak birleştirilmesi ve işlenmesi gerekir. Bu, genellikle kullanarak isteğe bağlı iletişim isteklerini işleyebileceğiniz veya uzun zaman uyumlu etkinlik sırasında kullanıcı eylemlerini işlemek için geçersiz kılabileceğiniz CSocket::OnMessagePending
anlamına gelirCAsyncSocket
.
Bu tartışmanın geri kalanı, 16 bit işletim sistemlerini hedefleyen programcılar içindir:
Normalde kullanıyorsanız CAsyncSocket
engelleme işlemlerini kullanmaktan kaçınmanız ve bunun yerine zaman uyumsuz olarak çalışmanız gerekir. Zaman uyumsuz işlemlerde, çağrısından Receive
sonra WSAEWOULDBLOCK hata kodunu aldığınız noktadan, örneğin, üye işleviniz OnReceive
çağrılana kadar sizi yeniden okuyabileceğinizi bildirmek için beklersiniz. Zaman uyumsuz çağrılar, yuvanızın OnReceive gibi uygun geri çağırma bildirim işlevi geri çağrılarak yapılır.
Windows altında, engelleme çağrıları kötü bir uygulama olarak kabul edilir. Varsayılan olarak, CAsyncSocket zaman uyumsuz çağrıları destekler ve geri arama bildirimlerini kullanarak engellemeyi kendiniz yönetmeniz gerekir. CSocket sınıfı ise zaman uyumludur. Windows iletilerini pompalar ve engellemeyi sizin için yönetir.
Engelleme hakkında daha fazla bilgi için bkz. Windows Yuvaları belirtimi. "Açık" işlevleri hakkında daha fazla bilgi için bkz . Windows Yuvaları: Yuva Bildirimleri ve Windows Yuvaları: Yuva Sınıflarından Türetme.
Daha fazla bilgi için bkz.