中国开发网: 论坛: Delphi/BCB: 贴子 37126
pcplayer: 关于 INDY,阻塞模式和非阻塞模式的资料
熟悉WINSOCK編程的讀者一定會覺得奇怪吧,爲什麽INDY是是完全基於SOCKET阻塞工作模式的呢?非同步模式(非阻塞模式)是WINSOCK的一大特點,爲什麽不用呢?

  其實,之所以大多數WINDOWS下的INTERNET程式都使用非同步模式,這和WINSOCK的歷史有關。當WINSOCK被移植到WINDOWS的時候,當時的WINDOWS作業系統還是WINDOWS 3.1,而WINDOWS 3.1是不支援多線程的,不象UNIX下可以使用FORK來運行多進程。在WINDOWS 3.1下,如果使用阻塞模式,在通訊時會鎖定用戶介面使程式沒有回應,爲了避免這種情況,WINSOCK就引入非同步模式這個新特性。而使用非同步模式來編制INTERNET程式也就成了WINDOWS程式師的經典教條。但是,隨著新的WINDOWS作業系統的出現,如WINDOWS 95、NT、98、ME、2000等,這些作業系統開始支援多線程。非同步模式這個教條仍然深入人心,使很多程式師會下意識的拒絕使用阻塞模式。

  事實上,UNIX下的SOCKET只支援阻塞模式(現在UNXI的SOCKET有了一些新的非阻塞特性,不過絕大多數應用仍然使用阻塞模式)。阻塞模式具有以下幾個比非同步模式優越的特點:

  編程更簡單,可以把所有處理SOCKET的代碼放在一起,順序執行,而不用分散在不同的事件處理代碼段裏。

  更容易移植到UNIX,使用INDY的DELPHI程式,可以不做太多(甚至不做)修改,就可以把WINDOWS的DELPHI源代碼拿到LINUX下,用Kylix來編譯成LINUX下的網路程式。

更容易在多線程程式裏使用,由於阻塞模式的代碼可以放在一起,可以很方便的把這些代碼包裹在線程裏面來使用,而不象非同步模式,需要針對不同的事件,設置不同的處理代碼。

  爲了兼顧簡單可靠和高效,INDY是基於阻塞模式工作的。阻塞模式需要等待任務完成才返回,這樣,當主線程裏調用阻塞任務運行時,程式不能處理用戶介面的消息。INDY提供了一個控制項TidAntiFreeze來解決這個問題。只要在你的程式裏,簡單的填加一個TidAntiFreeze控制項到任何地方(隨便往FORM上放),不需要寫任何代碼(最多把超時時間改一下),就可以很好的解決用戶介面不回應的問題。

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录