Aracılığıyla paylaş


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 CSocketveya 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 CAsyncSocketengelleme işlemlerini kullanmaktan kaçınmanız ve bunun yerine zaman uyumsuz olarak çalışmanız gerekir. Zaman uyumsuz işlemlerde, çağrısından Receivesonra 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.

Ayrıca bkz.

MFC'de Windows Yuvaları
CAsyncSocket::OnSend