Windows 通訊端: 封鎖
這份文件與兩個的同一系列文件文件將說明在 Windows 通訊端程式設計的幾個問題。 本文件涵蓋封鎖方面。 其他的問題包含了文件: Windows 通訊端: 位元組的順序 和 Windows 通訊端: 轉換字串。
如果您使用,或衍生自類別 CAsyncSocket,您必須自行管理這些問題。 如果您使用,或衍生自類別 CSocket,MFC 則會為您管理它們。
封鎖
通訊端可以在 「 封鎖模式 」 或 「 未封鎖模式 」。直到它們可以完成動作,不會傳回通訊端,以封鎖 (或同步) 模式的功能。 這稱為封鎖,因為呼叫的函式的通訊端不能執行任何動作,會被封鎖,直到呼叫傳回。 呼叫接收成員函式,例如,可能會花了很長的時間來完成,因為要等待傳送的應用程式來傳送 (這是您正在使用CSocket,或使用CAsyncSocket與封鎖)。 如果CAsyncSocket物件處於未封鎖模式 (以非同步的方式運作),呼叫會立即傳回與目前的錯誤碼,可以擷取與時發生成員函式,是 WSAEWOULDBLOCK,表示該呼叫會有封鎖擁有該不因模式會立即傳回。 (CSocket不會傳回 WSAEWOULDBLOCK。 類別為您管理封鎖。)
通訊端的行為差別在 32 位元與 64 位元作業系統 (例如 Windows 95 或 Windows 98) 是系統在 16 位元作業系統 (如 Windows 3.1)。 與 16 位元作業系統,不同的是 32 位元與 64 位元作業系統使用優先權多工作業,提供多執行緒處理。 在 32 位元與 64 位元作業系統上,您可以將您的通訊端不同的背景工作執行緒。 不會干擾其他應用程式中的活動,也不計算時間花在封鎖上的通訊端的往來文章中可能會封鎖。 多執行緒程式設計的相關資訊,請參閱文章進行多執行緒處理。
注意事項 |
---|
在多執行緒的應用程式中,您可以使用的封鎖本質CSocket來簡化您的程式設計,而不會影響使用者介面的回應速度。藉由處理主執行緒裡的使用者互動和CSocket處理其他執行緒裡,您可以將這些邏輯作業。不是多執行緒應用程式中,這兩個活動必須結合並以單一執行緒,這通常表示使用處理CAsyncSocket ,您可以處理要求,或覆寫的通訊要求CSocket::OnMessagePending以同步耗時,而且在處理使用者動作。 |
這個問題討論的其餘部分是針對 16 位元作業系統的程式設計師:
一般情況下,如果您使用CAsyncSocket,您應該避免使用封鎖作業,而是以非同步的方式運作。 非同步作業中,從您收到的點 WSAEWOULDBLOCK 電話之後的錯誤代碼接收,比方說,您稍候,直到您OnReceive成員函式會呼叫來通知您您可以讀取一次。 進行非同步呼叫的回呼通訊端的適當的回呼告知函式,例如 OnReceive。
在 Windows 中,封鎖呼叫會被視為不好的作法。 根據預設, CAsyncSocket 支援非同步呼叫,而且您必須管理封鎖您自己使用的告知回呼。 類別 CSocket,相反地,是同步的。 Pumps 的 Windows 訊息,並為您管理封鎖。
如需有關封鎖的詳細資訊,請參閱 Windows 通訊端規格。 "On"函式的相關資訊,請參閱 Windows 通訊端: 通訊端通知 和 Windows 通訊端: 衍生自通訊端類別。
如需詳細資訊,請參閱: