您现在的位置:首页 >> 网络通讯 >> 网络通讯 >> 内容

WinInet超时blocking的最佳解决方案

时间:2011/9/3 15:12:53 点击:

  核心提示:解决这个问题的途径之一是采用这些函数的异步模式。不过,这种方案的缺点是过于复杂,而且网上没有相关的代码或实例。如果不用异步模式,那么只有考虑多线程了。此方案看似简单,不过随之而来有一个很关键的问题:当...
解决这个问题的途径之一是采用这些函数的异步模式。不过,这种方案的缺点是过于复杂,而且网上没有相关的代码或实例。

如果不用异步模式,那么只有考虑多线程了。此方案看似简单,不过随之而来有一个很关键的问题:当工作线程中的WinInet发生blocking时,如何安全地终止它?要知道,当工作线程发生blocking时,waitforSingleObject(AHandle,Infinite)会一直运行下去。于是一个自然而然的想法是,设置一个timeout的时限,当waitforSingleObject(AHandle,timeout)收到WAIT_TIMEOUT信号时,就用TerminateThread强行终止该线程。

不过,很显然这样终止线程会产生严重的内存泄露。因此,解决WinInet超时的关键在于,如何安全终止发生阻塞的工作线程。本人是业余的新手,因此这个问题困惑了很长时间,后来偶然的一个机会,才发现了正确的解决方法。

具体如下:
当waitforSingleObject(AHandle,timeout)收到WAIT_TIMEOUT信号时,不要用TerminateThread强行终止工作线程,只要用InternetCloseHandle关闭打开的句柄就可以了。帮助文档对该函数的remark如下: 
The function terminates any pending operations on the handle and discards any outstanding data. If a thread is blocking a call to Wininet.dll, another thread in the application can call InternetCloseHandle on the Internet handle being used by the first thread to cancel the operation and unblock the first thread.

这样问题也迎刃而解了。本人是delphi的fans,也希望这篇文章能对其他的delphi的fans有所帮助。如果有需要代码的,可以随后附上。

作者:courage200 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
  • 盒子文章(www.2ccc.com) © 2022 版权所有 All Rights Reserved.
  • 沪ICP备05001939号